我有二进制文件,以hexa表示,例如
4d42 b666 000a 0000 0000 0036 0000 0028
前4个字节代表我想要提取的值。
我知道我可以正确地提取它
std::ifstream is("img.bmp", std::ifstream::binary);
uint64_t data = 0;
is.read((char*)&data,4)
会导致3060157762
但是使用
unsigned char * test = new unsigned char [ 4 ];
is.read((char*)test , 4 );
uint64_t t = 0;
for( int i = 0; i < 4;i++){
t <<= 8; // 2 hexa symbols = 1 byte = 1 char = 8 bits
t|= test[i];
}
cout << t << endl;
这导致1112368822
明显不同。
我想知道如何用第二种方法获得相同的结果?这有什么点滴技巧?除了我所展示的方法之外,我什么都想不到。
感谢您的帮助。
答案 0 :(得分:2)
首先,使用4字节类型存储4个字节。你不需要64位类型。问题是你在循环中扭转你的数字。
您的第二种方法将4个字节读入test
,如下所示:test[0] = 0x4, test[1] = 0xd, test[2] = 0x4, test[3] = 0x2
。您所做的是从右到左填充反向顺序中t
的字节。首先,用0x4填充最右边的字节,然后相应地向左移动0xd,0x4和0x2。所以你得到t == 0x24d4
。
执行该操作的代码:
unsigned char * test = new unsigned char [4];
is.read((char*)test, 4);
uint32_t t = 0;
for(int i = 3; i >= 0; --i) {
t <<= 8;
t |= test[i];
}
cout << t << endl;