c - 将数字作为原始二进制文件写入文件

标签 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

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

最佳答案

了解 Endianness ,它说明了字节在计算机系统中如何排列在一个字(或双字/四字等)中。

我假设您已经在 little-endian 的 X86 系统上编写和编译了这个示例,因此,最低有效位优先。与此相反的安排称为 big-endian

现在,很明显,您在本练习中的目标是编码(或pickle,具体取决于您喜欢的术语)一些字节,以便稍后检索,可能是由另一个程序。

如果您开发了一个程序,它使用 fread() 并以相同的方式读取数据(使用 sizeof(long) 这样您就不会读取太多数据)并且在具有相同字节顺序的机器中,它会神奇地起作用,你期望的数字会回来。但是,如果您在具有相反字节顺序的机器上编译并运行“读取”工具,读取相同的输入文件,您的数字将出现乱码。

如果您的目标是编码数据,您最好使用一个工具来帮助您以不可知字节序的方式编码字节,也就是说,一个库可以帮助您获得正确顺序的数据。有一些图书馆可以为您处理这些事情。

关于c - 将数字作为原始二进制文件写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39471415/

相关文章:

c++ - 保存和加载 C++ 程序

c++ - 从 fork 子进程返回后的文件指针

Char * 共享同一内存

c - POSIX Pthread 两个数字相加 C 代码

c++ - 从 std::istream 读取时,是否有比 reinterpret_cast<char*> 更好的选择?

c++ - 如何通过给定的 bin 文件打开和读取 C++ 中的二进制文件?

c - 将数据写入二进制文件

c - 查找 C 代码段的运行时间

diff - 识别两个等长文件之间二进制差异的工具?

C - 使用 fwrite 在其他结构数组中创建一个结构数组的 bin 文件