所以我试图将long
的值作为原始二进制文件写入fwrite()
的文件,这是一个测试文件:
#include<stdio.h>
int main() {
FILE* stream;
stream = fopen("write", "wb");
long number = 0xfff;
fwrite(&number, sizeof(long), 1, stream);
}
在文本编辑器中打开书面文件时,这是输出:
ff0f 0000 0000 0000
虽然我期待0000 0000 0000 0fff
之类的东西。
如何正确地将所需结果写为原始二进制文件?
答案 0 :(得分:3)
阅读Endianness,其中说明了如何在计算机系统中的字(或双字/四字等)中排列字节。
我假设您已在X86系统上编码和编译此示例,该系统是 little-endian ,因此,最低有效位COME FIRST。与此安排相反的是 big-endian 。
现在,很明显,您在此练习中的目标是 marshall (或 pickle ,取决于您喜欢的行话方式)稍后检索的某些字节,可能是另一个程序。
如果你开发一个使用fread()的程序,并以相同的方式读取数据(使用sizeof(长),这样你就不会读取太多的数据)和在具有相同的机器中读取数据它会神奇地发挥作用,而且你期望的数字会回来。但是,如果你编译并运行&#34; read&#34;在具有相反字节序的机器中的工具,读取相同的输入文件,您的数字将是乱码。
如果您的目标是编组数据,那么最好使用一种工具来帮助您以字节顺序无关的方式编组字节,也就是说,一个可以帮助您获取的库数据按正确的顺序排列。那里有图书馆为你照顾。
答案 1 :(得分:2)
没问题。您将其视为机器端序的ff0f 0000 0000 0000
原因!
请尝试使用fread()
代替!
答案 2 :(得分:1)
正如其他人在评论中指出的那样,这是一个字母序列&#34;问题&#34;。如果您打算在具有其他字节序的系统上运行软件,那么这只是一个问题。
This very useful resource是&#34; c endian&#34;的第一个结果。谷歌搜索,至少对我来说。我希望它可以帮助你。
编辑:我将在下面详细介绍。
要确定当前正在运行的计算机的字节顺序是什么,请将已知值(例如0xAABBCCDD
)写入内存,然后获取指向该值的指针并将其强制转换为char *或其他1字节数据类型。逐个字节地再次读取相同的值,并将排序与您编写的内容进行比较。如果它们是相同的,那么你就是一台大型机器。如果不是......那么你可能会在一个(更可能的)或中间(不太可能)的端机器上。在任何一种情况下,你都可以生成一个交换映射&#34;用于重新排序字节;这就是为什么我在上面的例子中选择了四个不同的字节值。
但是,如何交换这些值?如here所示,一种简单的方法是使用带掩码的位移。您还可以使用表格并交换它们的值。