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

问题描述 投票:3回答:1

我正在研究解析器代码来读取二进制文件中的所有数据。顺便提一下,二进制文件是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));
    }
}

正如我所提到的那样,endianness是Big-Endian,我发现this answer用于转换,它的工作方式就像一个魅力,但是当 - 为了exapmle - 我打印出binaryHeader我总是要交换字节序列。

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

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

c++ parsing binary endianness
1个回答
1
投票

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

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
© www.soinside.com 2019 - 2024. All rights reserved.