我正在研究解析器代码来读取二进制文件中的所有数据。顺便提一下,二进制文件是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?
好吧,我不知道这对你来说是否优雅,但是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