【问题标题】:Repeatedly fread() 16 bits from binary file从二进制文件中重复 fread() 16 位
【发布时间】:2013-04-18 20:06:55
【问题描述】:

我正在读取一个二进制文件。前 16 位代表一个数组索引,接下来的 16 位代表即将列出的 16 位项目的数量,然后剩下的 16 的倍数代表所有这些 16 位项目。例如,以下文件“程序”的十六进制转储:

 30 00 00 02 10 00 F0 25

表示索引0x3000,后面跟着0x0002个元素,分别是0x1000和0xF025。

 FILE *fp = fopen(program, "rb");
 char indexChar, nItemsChar;
 u_int16_t index, nItems;
 fread (&indexChar, 2, 1, fp);
 fread (&nItemsChar, 2, 1, fp);
 address = strtol(&indexChar, NULL, 16);
 nItems = strtol(&nItemsChar, NULL, 16);
 for (u_int16_t i = 0; i < nItems; ++i)
 {
     fread (state->mem + index + i, 2, 1, fp);
 } 

我什至不确定这种方法是否有效,因为我在尝试 fRead() 进入 nItemsChar 时得到 EXC_BAD_ACCESS。我做错了什么?

【问题讨论】:

  • 用二进制模式'rb'打开它。并且读取大小是 sizeof(u_int16_t) 计数 1 不是读取大小 2 计数 1。
  • 哎呀,应该是'rb'。但是,是的,即使发生了这种变化,它仍在发生。
  • 您正在将 2 个字节读入字符。将 indexChar 和 nItemsChar 设为 char[2]。

标签: c file file-io binary hex


【解决方案1】:

您混淆了 ascii(文本)文件 i/o 和二进制文件。

  • 程序在 fread(&nItemsChar,2,1,fp) 处崩溃,因为您已将 2 个字节读入 1 个字节的内存空间(实际上它可能在前一个 fread 上搞砸了)
  • 然后您尝试使用 strtol,它将 ascii 转换为 long int,但读取的值是二进制的

而只是使用

fread(&index, sizeof(index),1,fp);
fread(&nItems, sizeof(nItems),1,fp);

然后是 for 循环。请注意,这假定文件以与您的处理器/配置相同的字节顺序写入。

【讨论】:

    【解决方案2】:
    uint16_t index, *nItems;
    
    fread (&index, sizeof(uint16_t), 1, fp);
    nItems = (uint16_t*)calloc(index, sizeof(uint16_t));
    fread (nItems, sizeof(uint16_t), index, fp);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2018-11-25
      • 2015-08-22
      • 2019-04-13
      • 1970-01-01
      • 2016-04-19
      相关资源
      最近更新 更多