将数字写为原始二进制文件

时间:2016-09-13 13:32:09

标签: c binaryfiles fwrite

所以我试图将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之类的东西。

如何正确地将所需结果写为原始二进制文件?

3 个答案:

答案 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所示,一种简单的方法是使用带掩码的位移。您还可以使用表格并交换它们的值。