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

时间:2019-02-18 16:56:45

标签: c++ parsing binary endianness

我正在研究一个解析器代码,以从二进制文件中读取所有数据。二进制文件在Big-Endian中。 读取文件的二进制标头时,通过以下方法将其读入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));
    }
}

正如我所提到的,字节序是Big-Endian,我发现this answer用于转换,它像一个符咒一样工作,但是当-例如-我打印出binaryHeader时,我总是必须交换序列字节。

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

问题:是否有任何优雅的方法将整个binaryHeader转换为Little-Endian?

1 个答案:

答案 0 :(得分:1)

好吧,我不知道这是否对您有益,但是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());