C++ 将Big-Endian结构转换为Little-Endian C++;
我正在编写一个解析器代码来读取二进制文件中的所有数据。顺便说一句,二进制文件是大端的。 当我读取文件的二进制头时,我通过以下方法将其读入C++ 将Big-Endian结构转换为Little-Endian C++;,c++,parsing,binary,endianness,C++,Parsing,Binary,Endianness,我正在编写一个解析器代码来读取二进制文件中的所有数据。顺便说一句,二进制文件是大端的。 当我读取文件的二进制头时,我通过以下方法将其读入结构中: 结构: 解析方法: void Segy::parseSegyFile(){ char textHeader[3200];//跳过第一个3200字节 ifs.read(textHeader,sizeof(textHeader)); 二进制头二进制头; ifs.read(reinterpret_cast(&binaryHeader),sizeof(bina
结构中:
结构:
解析方法:
void Segy::parseSegyFile(){
char textHeader[3200];//跳过第一个3200字节
ifs.read(textHeader,sizeof(textHeader));
二进制头二进制头;
ifs.read(reinterpret_cast(&binaryHeader),sizeof(binaryHeader));
}
}
正如我提到的,endianness是Big-Endian,我发现用于转换,它就像一个符咒一样工作,但是当——例如——我打印出binaryHeader时,我总是需要交换字节序列
std::cout << std::left << std::setw(w) << "JobID:" << std::fixed << SwapEnd(binaryHeader.jobID) << std::endl
std::cout我不知道这是否对你有好处,但可能对你有帮助
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
上调用SwapEnd
?创建一个小数组,列出成员的大小(desc
)。并创建一个函数,该函数接受指向标头的指针和指向desc
的指针,并执行字节交换。这样你可以使用这个函数来构造任何结构。@ NaNaOLIVER:它会交换成员的顺序,这不是故意的。不,C++没有反射(还没有)。也许看看magic_get(实际上,不要)。看看boost-endian缓冲区。我想这是解决你问题的最简单的方法。
std::cout << std::left << std::setw(w) << "JobID:" << std::fixed << SwapEnd(binaryHeader.jobID) << std::endl
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);
}
};
boost::fusion::for_each(b, EndianSwap());