我如何在 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)
谢谢
您犯了将数据与该数据的表示混淆的经典错误。
假设您有一个文本文件。如果您在记事本中打开它,您将看到以下内容:
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真正做的唯一一件事是保证在读/写数据时库不会转换行尾。