1

我正在读取一个二进制文件。前 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。我究竟做错了什么?

4

2 回答 2

0
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);
于 2013-04-25T10:35:35.113 回答
0

您混淆了 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循环。请注意,这假定该文件以与您的处理器/配置相同的字节顺序写入。

于 2013-04-25T04:08:08.427 回答