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 字符,并将该文本呈现到您的屏幕上。

现在,如果您使用十六进制编辑器打开该文件,您将看到完全不同的内容1

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

这是因为十六进制编辑器取而代之的是原始数据的每个字节,并将其显示为两个字符的十六进制数字。

1 - 假设 Windows\r\n行尾和 ASCII 编码。


因此,如果您期待十六进制 ASCII 输出,则需要在字符串(作为 ASCII 文本!)写入文件之前将其转换为十六进制编码。

在 PHP 中,您要查找的是bin2hex“返回包含 str 的十六进制表示的 ASCII 字符串”的函数。例如:

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

请注意,"wb"模式参数不会导致任何特殊行为。它保证二进制输出,而不是十六进制输出。我怎么强调都不为过。唯一b真正做的是保证在读取/写入数据时库不会转换行尾。

于 2013-07-04T04:24:29.250 回答