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

Convert Big-Endian struct to Little-Endian C++

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

结构:

struct BinaryHeader{
    int jobID; 
    int lineNumber; 
    int reelNumber; 
    short unsigned int tracesPerEnsemble; 
    short int aTracesPerEnsemble; 
    short unsigned int sampleInterval; 
    short unsigned int sampleIntervalOriginalFieldRec; 
    short unsigned int samplesPerTrace; 
    short unsigned int samplesPerTraceOriginalFieldRec;
    ...etc.

解析方式:

void Segy::parseSegyFile(){
    char textHeader[3200]; //to skip the first 3200 byte
    ifs.read(textHeader,sizeof(textHeader));
    BinaryHeader binaryHeader;
    ifs.read(reinterpret_cast<char *>(&binaryHeader), sizeof(binaryHeader));
    }
}

正如我提到的字节序是大端字节序,我发现 this answer 用于转换并且它的工作原理很吸引人但是当 - 例如 - 我打印出 binaryHeader 我总是必须交换字节序列。

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

问题:有什么优雅的方法可以将整个binaryHeader转为Little-Endian吗?

好吧,我不知道这对你来说是否优雅,但 boost::fusion 可能会对你有所帮助。

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 后就这样做。

boost::fusion::for_each(b, EndianSwap());