【发布时间】:2019-02-18 16:56:45
【问题描述】:
我正在编写一个解析器代码来读取二进制文件中的所有数据。顺便说一下,二进制文件是 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?
【问题讨论】:
-
只需拨打
SwapEndbinaryHeader? -
创建一个小数组,列出成员的大小 (
desc)。并创建一个函数,它接受一个指向标头的指针和一个指向desc的指针并进行字节交换。这样您就可以将此函数用于任何结构。 -
@NathanOliver:它会交换成员的顺序,这不是有意的。
-
不,C++ 还没有反射。也许看看magic_get(实际上,不要)。
-
查看 boost endian 缓冲区。我认为这是解决您的问题的最简单方法。
标签: c++ parsing binary endianness