从二进制文件中重复fread()16位

时间:2013-04-25 03:57:24

标签: c file file-io binary hex

我正在读一个二进制文件。前16位表示数组索引,接下来的16位表示将要列出的16位项的数量,然后16的剩余倍数表示所有这些16位项。例如,文件'program'的以下十六进制转储:

 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。我做错了什么?

2 个答案:

答案 0 :(得分:0)

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

  • 程序在fread(&amp; nItemsChar,2,1,fp)崩溃,因为你已经在1字节的内存空间中读取了2个字节(实际上它可能会弄乱前一个fread)
  • 然后尝试使用从ascii转换为long int的strtol,但读取的值是二进制

而只是使用

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

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

答案 1 :(得分: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);