1

(PHPで)Cでこのコードのように簡単なことをするにはどうすればよいですか:

char buffer[5] = "testing";
FILE* file2 = fopen("data2.bin", "wb");
fwrite(buffer, sizeof buffer, 1, file2);
fclose(file2);

PHP でバイナリ ファイルを書き込もうとすると、実際のバイナリが書き込まれません。

例:

$ptr = fopen("data2.bin", 'wb');

fwrite($ptr, "testing");

fclose($ptr);

これを行うために使用する必要があることをインターネットで見つけましたpack()...

私が期待したこと:

testing\9C\00\00
or
7465 7374 696e 679c 0100 00

私が得たもの:

testing412

ありがとう

4

1 に答える 1

5

データとそのデータ表現を混同するという典型的な間違いを犯しています。

テキストファイルがあるとしましょう。メモ帳で開くと、次のように表示されます。

hello
world

これは、メモ帳がデータがASCIIテキストであると想定しているためです。したがって、生データのすべてのバイトを取得し、それを ASCII 文字として解釈し、そのテキストを画面に表示します。

そのファイルを 16 進エディタで開くと、まったく異なるものが表示されます1 :

68 65 6c 6c 6f 0d 0a 77 6f 72 6c 64          hello..world

これは、代わりに 16 進エディタが生データのすべてのバイトを取得し、それを 2 文字の 16 進数として表示するためです。

\r\n1 - Windowsの行末と ASCII エンコーディングを想定。


したがって、16 進数の ASCII 出力が必要な場合は、ファイルに (ASCII テキストとして!) 書き込む前に、文字列を 16 進数のエンコーディングに変換する必要があります。

PHP で探しているのは、bin2hex「str の 16 進表現を含む ASCII 文字列を返す」関数です。例えば:

$str = "Hello world!";
echo bin2hex($str);      // output:  48656c6c6f20776f726c6421

"wb"モード引数は特別な動作を引き起こさないことに注意してください。16 進出力ではなく、2 進出力を保証します。違いがあることを十分に強調することはできません。実際に行う唯一のことは、データの読み取り/書き込み時に行末がライブラリによって変換されないことを保証することです。b

于 2013-07-04T04:24:29.250 に答える