ファイルベースのシステムからデータベースに格納されたブロブに移動しようとしているコードブロックがありますが、これと同等の文字列ベースのメソッドを見つけるのは困難ですメソッド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を受け入れるソリューション:
'SUBSTR()' '$のdata'のサブストリングを抽出するために使用します。 – Barmar
各値をBLOBとしてエンコードするのではなく、別の列として格納する方が簡単でしょうか? – Barmar