真正的二进制写PHP

Mau*_*ano 1 php binary

我如何在 C 中做一些像(在 PHP 中)这段代码一样简单的事情:

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

每当我尝试用 PHP 编写二进制文件时,它都不是真正的二进制文件。

例子:

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

fwrite($ptr, "testing");

fclose($ptr);
Run Code Online (Sandbox Code Playgroud)

我在互联网上发现我需要使用它pack()来执行此操作...

我的期望:

testing\9C\00\00
or
7465 7374 696e 679c 0100 00
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

testing412
Run Code Online (Sandbox Code Playgroud)

谢谢

Jon*_*art 5

您犯了将数据与该数据表示混淆的经典错误。

假设您有一个文本文件。如果您在记事本中打开它,您将看到以下内容:

hello
world
Run Code Online (Sandbox Code Playgroud)

这是因为记事本假定数据是ASCII文本。因此,它获取原始数据的每个字节,将其解释为 ASCII 字符,并将该文本呈现到您的屏幕上。

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

68 65 6c 6c 6f 0d 0a 77 6f 72 6c 64          hello..world
Run Code Online (Sandbox Code Playgroud)

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

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


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

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

$str = "Hello world!";
echo bin2hex($str);      // output:  48656c6c6f20776f726c6421
Run Code Online (Sandbox Code Playgroud)

请注意,"wb"mode 参数不会导致任何特殊行为。它保证二进制输出,而不是十六进制输出。我不能强调有区别。b真正做的唯一一件事是保证在读/写数据时库不会转换行尾。

  • 你真的应该玩这些东西直到它*完美*,因为它是计算机和二进制数据工作方式的基础。 (3认同)