2013-07-04 4 views
2

Как я могу сделать что-то просто (в PHP) этот код в C:Real двоичная запись PHP

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 

Благодаря

+0

Что заставляет вас думать, что он не пишет в «реальном двоичном коде»? Что это значит? – Barmar

+0

Что значит «он не пишет в реальном двоичном коде»? Что вы ожидали от результата, и что вы получили? –

+0

Я ожидаю получить что-то вроде 4d61 7572 6963 696f 0063 ecbf 855a 61b7 00d6 7bb7 1200 0000 00ba 7f47, но я получаю обычный текст как обычный текстовый файл. –

ответ

4

Вы делаете классическую ошибку запутанных данных с представления этих данных.

Предположим, у вас есть текстовый файл. Если открыть его в блокноте, вы увидите следующее:

hello 
world 

Это потому, что Блокнот принимает данные ASCII текст. Поэтому он берет каждый байт необработанных данных, интерпретирует его как символ ASCII и отображает этот текст на ваш экран.

Теперь, если вы идете и открыть этот файл с помощью шестнадцатеричного редактора, вы увидите что-то совсем другое :

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

Это происходит потому, что шестнадцатеричный редактор вместо этого берет каждый байт необработанных данных, и отображает его как двухсимвольное шестнадцатеричное число.

1 - Предполагая, что Windows \r\n окончания строки и кодировка ASCII.


Так что, если вы ожидаете шестнадцатеричный вывод ASCII, вы должны преобразовать вашей строки в шестнадцатеричной кодировку перед записью (как ASCII текст!) В файл.

В PHP то, что вы ищете, это функция bin2hex, которая «Возвращает строку ASCII, содержащую шестнадцатеричное представление str». Например:

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

Обратите внимание, что режим "wb" аргумент не вызывает какого-либо специального поведения. Он гарантирует двоичный выход, не hexadecimal мощность. Я не могу подчеркнуть, что есть разница. Единственное, что действительно делает b, это гарантия того, что окончание строк не будет преобразовано библиотекой при чтении/записи данных.

+0

Спасибо! Но почему PHP этого не делает? В C, если я помещаю «wb» в качестве аргумента в fopen, он сохраняет все в двоичном формате ... Но в PHP кажется, что он просто игнорируется. –

+0

@ MaurícioGiordano Нет, C абсолютно не делает то, что вы только что описали. Пожалуйста, скомпилируйте и запустите свой C-код из вопроса и откройте результат в текстовом редакторе *. Вы увидите ASCII. Режим '' wb'' делает ** не ** делать то, что вы думаете. –

+0

Но он не сохраняется в ASCII, потому что, если я открываю его с помощью Блокнота, он показывает странные символы ... –

Смежные вопросы