C++ 将Big-Endian结构转换为Little-Endian C++;

C++ 将Big-Endian结构转换为Little-Endian C++;,c++,parsing,binary,endianness,C++,Parsing,Binary,Endianness,我正在编写一个解析器代码来读取二进制文件中的所有数据。顺便说一句,二进制文件是大端的。 当我读取文件的二进制头时,我通过以下方法将其读入结构中: 结构: 解析方法: void Segy::parseSegyFile(){ char textHeader[3200];//跳过第一个3200字节 ifs.read(textHeader,sizeof(textHeader)); 二进制头二进制头; ifs.read(reinterpret_cast(&binaryHeader),sizeof(bina

我正在编写一个解析器代码来读取二进制文件中的所有数据。顺便说一句,二进制文件是大端的。 当我读取文件的二进制头时,我通过以下方法将其读入
结构中:

结构:

解析方法:

void Segy::parseSegyFile(){
char textHeader[3200];//跳过第一个3200字节
ifs.read(textHeader,sizeof(textHeader));
二进制头二进制头;
ifs.read(reinterpret_cast(&binaryHeader),sizeof(binaryHeader));
}
}
正如我提到的,endianness是Big-Endian,我发现用于转换,它就像一个符咒一样工作,但是当——例如——我打印出binaryHeader时,我总是需要交换字节序列

std::cout << std::left << std::setw(w) << "JobID:" << std::fixed << SwapEnd(binaryHeader.jobID) << std::endl

std::cout我不知道这是否对你有好处,但可能对你有帮助

struct BinaryHeader{
    int jobID; 
    int lineNumber; 
    int reelNumber; 
    ...
};
BOOST_FUSION_ADAPT_STRUCT(
    BinaryHeader,
    jobID,
    lineNumber,
    reelNumber
    ...
)
struct EndianSwap
{
    template<typename T>
    void operator()(T& t) const
    {
        SwapEnd(t);
    }
};

只需在
binaryHeader
上调用
SwapEnd
?创建一个小数组,列出成员的大小(
desc
)。并创建一个函数,该函数接受指向标头的指针和指向
desc
的指针,并执行字节交换。这样你可以使用这个函数来构造任何结构。@ NaNaOLIVER:它会交换成员的顺序,这不是故意的。不,C++没有反射(还没有)。也许看看magic_get(实际上,不要)。看看boost-endian缓冲区。我想这是解决你问题的最简单的方法。
std::cout << std::left << std::setw(w) << "JobID:" << std::fixed << SwapEnd(binaryHeader.jobID) << std::endl
struct BinaryHeader{
    int jobID; 
    int lineNumber; 
    int reelNumber; 
    ...
};
BOOST_FUSION_ADAPT_STRUCT(
    BinaryHeader,
    jobID,
    lineNumber,
    reelNumber
    ...
)
struct EndianSwap
{
    template<typename T>
    void operator()(T& t) const
    {
        SwapEnd(t);
    }
};
boost::fusion::for_each(b, EndianSwap());