c++ - 从二进制文件字节到整数

标签 c++ file-io binary

我想做的:读取一系列 4 个字节,例如来自二进制文件的 00000000 00000011 00000001 00000011 (这是一个随机示例),并将其表示为我的程序中的整数。最好的方法是什么?

编辑解决方案我忽略了 PNG 文件格式规范的这一部分 here ,希望这对发现该问题的任何人都有用。

我正在尝试 PNG 图像格式,但在提取 4 字节数字时遇到问题。我已成功打开并打印文件的二进制表示形式,因此我知道我正在使用的数据没有损坏或格式错误。

我已经查看了类似 Reading 16-bit integers from binary file c++ 的问题,以及 32 位等效项,但我无法辨别它们是否正在读取二进制文件中的整数,例如00000000 72 00000000 或将字节读取为整数,这就是我的目标。

例如,第一个 block 的前四个字节是 00000000 00000000 00000000 0000110113

按照上面的问题示例,这应该 == 13:

int test;
img.read( (char*) &test, sizeof(test));

但它输出218103808

我还尝试了使用字符数组和整数数据成员的 union 的方法,并得到了 218103808 的相同输出

另外,在我的系统上 sizeof(int) 等于 4

最后,为了确保它不是格式错误的 PNG(我不太确定),我使用 gimp 导入它,然后将其导出为新文件,因此是在我的系统上本地创建的。

编辑

正如我提到的,在 seekg(8) 之后,接下来的四个字节是 00000000 00000000 00000000 00001101 但当我决定测试 read函数使用

bitset<32> num;
img.read( (char*) &num, sizeof(int) );

它输出00001101 00000000 00000000 00000000 我只是对这部分感到困惑。就好像这里的字节颠倒了一样。这串字节等于 218103808

任何见解将不胜感激

最佳答案

请注意,218103808 的十六进制值是 0x0D000000。您可能想阅读 Endianess

这意味着您正在读取的数据是大端格式,而您的平台使用小端格式。

基本上,您需要反转 4 个字节(并且您可能希望使用无符号整数),因此您会得到 0x0000000D(十进制 13),您可以这样做:

#define BSWAPUINT(x)  ((((x) & 0x000000ff) << 24) |\
                       (((x) & 0x0000ff00) << 8)  |\
                       (((x) & 0x00ff0000) >> 8)  |\
                       (((x) & 0xff000000) >> 24))
unsigned int test;
img.read( (char*) &test, sizeof(test));
test = BSWAPUINT(test);

上面的代码只有在小端平台上运行时才有效。

为了让您的代码独立于您的平台是大端还是小端,您可以自己将字节组装为整数,假设您知道数据格式是大端,您可以这样做:

unsigned char buf[4];
unsigned int test;
img.read( (char*) &test, sizeof(test));
test  = (unsigned int)buf[0] << 24;
test |= buf[1] << 16;
test |= buf[2] << 8;
test |= buf[3];

或者,在 UNIX 系统上您可以 #include <arpa/inet.h>并使用ntohl ()

test = ntohl(test);

(以这种方式处理数据,您也最好使用 uint32_t 等类型而不是 int/unsigned int's ,来自 stdint.h )

关于c++ - 从二进制文件字节到整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33511395/

相关文章:

c++ - 什么时候值得定义一个新的数据类型

java - 字符串中的字符替换需要很长时间

java - 使用 JSF 2/CDI 提供文件,使用可添加书签的 URL

c - 如何将char值转换为二进制并分别显示每一位?

c++ - 使用 C++ 将目录大小存储到整数变量中

c++ - 在 OpenGL 4.0 中是否有围绕局部坐标(即从模型 View 矩阵)旋转的标准方法?

c++ - 我必须抛出异常吗?

perl - 意外的逻辑错误

c# - 当事件发生时将数据写入 xml 时出现问题

vb.net - 删除 VB.Net 中的 "Invisible"控制字符