用位操作

时间:2017-03-31 13:17:12

标签: c++ hex byte bit

我有二进制文件,以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明显不同。

我想知道如何用第二种方法获得相同的结果?这有什么点滴技巧?除了我所展示的方法之外,我什么都想不到。

感谢您的帮助。

1 个答案:

答案 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;