【问题标题】:Bytes swapped using fread from binary (hex) file使用二进制(十六进制)文件中的 fread 交换的字节数
【发布时间】:2018-08-29 23:58:08
【问题描述】:

我有以下输入的二进制文件(十六进制表示),

0000 1900

我正在使用以下代码将数据读入整数。

 fp = fopen(argv[1], "rb");
    if (fp == NULL){
        printf("Error - Failed opening the file\n");
        return EXIT_FAILURE;
    } else{
        printf("Disk image file [%s] opened...\n\n", argv[1]);
    }

int x = 0;
fread(&x, sizeof(int), 1, fp);
printf("Block count Hex: %x\n", x);
printf("Block count dec: %d\n", x);

产生以下输出后,字节位置似乎被 fread 函数交换了。

Block count Hex: 190000
Block count dec: 1638400

如果我已经阅读了字节序问题,但这似乎与我得到的输出不匹配。任何帮助解决这个问题将不胜感激。

补充问题:

-读取存储在 int 变量中的十六进制值的最佳方法是什么?我一直在使用 %x 和 pŕintf,我想知道是否有更好的方法来调试我的代码。

【问题讨论】:

  • 这看起来确实是一个字节序问题,如果您打印带有左侧填充零的十六进制数字(即 00190000)可能会更清楚。这与文件中的内容完全相反。 (这里假设你给我们的文件内容是十六进制的)
  • 使用 little-endian int 时会出现这种情况。
  • @user202729 如果是小端反转,输出不会是 00 19 00 00 吗?
  • ...你知道前导零没有任何价值,对吧?
  • 其他程序生成的文件是 4 字节整数吗?还是它写入两个 2 字节整数? htonlntohl 函数可能有用。

标签: c binary hex endianness fread


【解决方案1】:

为了处理计算机之间或应用程序之间传输数据时的字节顺序问题,htonlntohl 函数很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2011-10-11
    • 1970-01-01
    • 2014-06-10
    • 2015-08-08
    • 2015-01-21
    相关资源
    最近更新 更多