2016-03-22 6 views
0

ファイルベースのシステムからデータベースに格納されたブロブに移動しようとしているコードブロックがありますが、これと同等の文字列ベースのメソッドを見つけるのは困難ですメソッドfread()fread()からsqlフィールドの内容に変換する

次のように私が変換しようとしているコードは次のとおりです。

$max_codewords_array=array(0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156, 1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706); 
$max_codewords=$max_codewords_array[$this->qrcode_version]; 
$max_modules_1side=17+($this->qrcode_version <<2); 
$matrix_remain_bit=array(0,0,7,7,7,7,7,0,0,0,0,0,0,0,3,3,3,3,3,3,3,4,4,4,4,4,4,4,3,3,3,3,3,3,3,0,0,0,0,0,0); 

/* ---- read version ECC data file */ 
$byte_num=$matrix_remain_bit[$this->qrcode_version]+($max_codewords << 3); 
$filename=QRCODE_DATA_PATH."/qrv".$this->qrcode_version."_".$ec.".dat"; 

$fp1 = fopen ($filename, "rb"); 
$matx=fread($fp1,$byte_num); 
$maty=fread($fp1,$byte_num); 
$masks=fread($fp1,$byte_num); 
$fi_x=fread($fp1,15); 
$fi_y=fread($fp1,15); 
$rs_ecc_codewords=ord(fread($fp1,1)); 
$rso=fread($fp1,128); 
fclose($fp1); 

私は「データ」という名前のフィールドにbin2hex (gzencode(str))としてデータベースに格納されたデータを持っているし、何の問題バックアウトにこのデータを読み込むを持っていませんなどの変数は次のとおりです。それはfread()セクションに来るとき

$data = gzdecode(hex2bin($field['Data'])); 

はしかし、私はまた、バイナリセーフであるように、すべてのこれらのコマンドを交換するかどうかはわかりません。私は内容を使用し、代わりに$fp1ファイルハンドルの、同等のバイナリセーフな文字列メソッドでfread()を交換したいコードを次に示し

(別名、新しい$data値は、ファイル全体のfread()が正常に通じチャンクという内容が含まれています) $dataに格納されています(前述)。

$matx=fread($fp1,$byte_num); 
$maty=fread($fp1,$byte_num); 
$masks=fread($fp1,$byte_num); 
$fi_x=fread($fp1,15); 
$fi_y=fread($fp1,15); 
$rs_ecc_codewords=ord(fread($fp1,1)); 
$rso=fread($fp1,128); 

(返事を待っている間、私は働き、このソリューションを書きました)

文字列リーダークラス

class sread { 
    static $position = 0; 
    static $data; 

    public static function open($data) { 
     self::$data = $data; 
    } 

    public static function read($bytes) { 
     if((self::$position + $bytes) >= strlen(self::$data)) { 
      $data = substr(self::$data, self::$position); 
     } else { 
      $data = substr(self::$data, self::$position, $bytes); 
     } 
     self::$position = self::$position + strlen($data); 
     return $data; 
    } 

    public static function close() { 
     self::$data = null; 
     self::$position = 0; 
    } 
} 

使用

$data = ""; // the long string containing the data you wish to move through 

sread::open($data); 
$matx = sread::read($byte_num); 
$maty = sread::read($byte_num); 
$masks = sread::read($byte_num); 
$f1_x = sread::read(15); 
$f1_y = sread::read(15); 
$rs_ecc_codewords = ord(sread::read(1)); 
$rso = sread::read(128); 
sread::close(); 

これは、非常にラフな試験しかし、それを自由に展開してください。 Barmarsのソリューションは同じことをしますが、このクラスはバイトのインクリメントを処理し、fread()のドロップイン置換とほぼ同じ構文です。 Barmarsを受け入れるソリューション:

+0

'SUBSTR()' '$のdata'のサブストリングを抽出するために使用します。 – Barmar

+0

各値をBLOBとしてエンコードするのではなく、別の列として格納する方が簡単でしょうか? – Barmar

答えて

1

substrを使用し、変数を使用して、データを調べる際の現在の位置を追跡します。

$curpos = 0; 
$matx = substr($data, $curpos, $byte_num); 
$curpos += $byte_num; 
$maty = substr($data, $curpos, $byte_num); 
$curpos += $byte_num; 
$masks = substr($data, $curpos, $byte_num); 
$curpos += $byte_num; 
$fi_x = substr($data, $curpos, 15); 
$curpos += 15; 
$fi_y = substr($data, $curpos, 15); 
$curpos += 15; 
$rs_ecc_codewords = ord(substr($data, $curpos, 1)); 
$curpos += 1; 
$rso = substr($data, $curpos, 128); 

もう一つの方法は、キャプチャグループとして、各部分を抽出するために、正規表現で次のようになります。

$regex = "/(.{$byte_num})(.{$byte_num})(.{$byte_num})(.{15})(.{15})(.)(.{128})/"; 
preg_match($regex, $data, $match); 
list ($ignore, $matx, $maty, $masks, $fi_x, $fi_y, $rs_ecc_char, $rso) = $match; 
$rss_ecc_codewords = ord($rss_ecc_char); 
+0

あなたがこれを書いている間、私は周りを包み込み、どこでも(かなり) 'fopen'、' fread'、 'fclose'のような形式でデータを扱うようにスワップしていますファイルリソースではなく文字列として扱います。正規表現の構文では、バイナリデータでどのように動作するのか分かりませんが、 'substr'は' mb_substr'よりも柔軟性があるようです。返信いただきありがとうございます:) –

+1

バイナリデータについては、 'unpack()'を見てください。 – Barmar

関連する問題