从二进制文件中重复 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 位的主要内容,如果未能解决你的问题,请参考以下文章

PHP:从二进制数据流中解压缩32位整数

PHP如何将从二进制文件中读取的字节转换为数字

C - 从二进制文件中读取位

在 Swift 中从二进制文件中读取整数

如何从二进制文件中查找静态分配的大小?

在python中如何从二进制文件中读取信息