gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:54:38 24 4
gpt4 key购买 nike

我正在编写解析器代码以从二进制文件中读取所有数据。顺便说一句,二进制文件是大端的。当我读取文件的二进制头时,我通过这种方法将其读入 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());

关于c++ - 将 Big-Endian 结构转换为 Little-Endian C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54752037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com