【问题标题】:Convert Big-Endian struct to Little-Endian C++将 Big-Endian 结构体转换为 Little-Endian C++
【发布时间】: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


【解决方案1】:

好吧,我不知道这对你来说是否优雅,但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());

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2020-12-01
    • 2019-06-30
    • 2018-10-23
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2017-08-26
    相关资源
    最近更新 更多