使用reinterpret_cast从存储在char数组中的二进制文件中读取值(C ++)

时间:2018-06-21 14:00:07

标签: c++ binary reinterpret-cast

我正在尝试以已知格式读取二进制文件。我想找到从中提取值的最有效方法。我的想法是:

方法1:将每个值读入新的char数组,然后将其转换为正确的数据类型。对于前4个字节的正整数,我将这些值相应地进行位移位并分配给以下整数。

方法2:将整个文件保留在char数组中,然后创建指向文件不同部分的指针。在下面的代码中,我尝试指向这前4个字节,并在取消引用变量“ bui”时使用reinterpret_cast将其解释为整数。

但是此代码的输出是:

11000000001100000000110000000011
3224374275
00000011000011000011000011000000
51130560

我的问题是

  • 为什么使用我的方法2交换字节序,我如何正确指向它?
  • 哪种方法更有效?我需要所有文件,并且该文件也包含其他数据类型,因此如果使用方法1,我将需要编写不同的方法来解释它们。我假设如果使用方法2,就可以定义不同的类型指针而无需做额外的工作!

谢谢

#include <iostream>
#include <bitset>

int main(void){
    unsigned char b[4];
    //ifs.read((char*)b,sizeof(b));
    //let's pretend the following 4 bytes are read in representing the number 3224374275:
    b[0] = 0b11000000;
    b[1] = 0b00110000;
    b[2] = 0b00001100;
    b[3] = 0b00000011;

    //method 1:
    unsigned int a = 0; //4 byte capacity
    a = b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3];
    std::bitset<32> xm1(a);
    std::cout << xm1 << std::endl;
    std::cout << a << std::endl;

    //method 2;
    unsigned int* bui = reinterpret_cast<unsigned int*>(b);
    std::bitset<32> xm2(*bui);
    std::cout << xm2 << std::endl;
    std::cout << *bui << std::endl;
}

0 个答案:

没有答案