我想做的:读取一系列 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 00001101
或 13
。
按照上面的问题示例,这应该 == 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/