从二进制文件中重复 fread() 16 位
Posted
技术标签:
【中文标题】从二进制文件中重复 fread() 16 位【英文标题】:Repeatedly fread() 16 bits from binary file 【发布时间】: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]。 【参考方案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);
【讨论】:
以上是关于从二进制文件中重复 fread() 16 位的主要内容,如果未能解决你的问题,请参考以下文章