使用现代c ++读取解析二进制文件

时间:2018-03-03 09:23:43

标签: c++ parsing templates

我想使用现代c ++技术解析二进制文件。我在互联网上搜索,发现2014年有很好的堆栈溢出答案。

Parsing a binary file. What is a modern way?

在该答案中,使用模板有一种非常有趣的方法。当我正在尝试学习c ++模板时,如何使用这个例子对我来说有点太先进了。

我尽可能地将示例剥离,但我无法弄清楚如何使用它来解析文件中的二进制数据(所有Uint16 LE)。

由于我真的想了解这段代码是如何工作的,我需要做些什么来获取这个示例代码(从参考SO链接复制)来解析我的文件?

由于

电车

#include <iostream>
#include <assert.h>
#include <fstream>

using Buffer = std::pair<unsigned char const*, size_t>;

template <typename OffsetReader>
class UInt16LEReader: private OffsetReader {
public:
    UInt16LEReader() {}
    explicit UInt16LEReader(OffsetReader const osr): OffsetReader(osr) {}

    uint16_t read(Buffer const& buffer) const {
        OffsetReader const& osr = *this;

        size_t const offset = osr.read(buffer);
        assert(offset <= buffer.second && "Incorrect offset");
        assert(offset + 2 <= buffer.second && "Too short buffer");

        unsigned char const* begin = buffer.first + offset;

        // http://commandcenter.blogspot.fr/2012/04/byte-order-fallacy.html
        return (uint16_t(begin[0]) << 0) + (uint16_t(begin[1]) << 8);
}
}; // class UInt16LEReader

template <size_t O>
class FixedOffsetReader {
public:
    size_t read(Buffer const&) const { return O; }
}; // class FixedOffsetReader

class LocalFileHeader {
public:
    template <size_t O>
    using UInt16 = UInt16LEReader<FixedOffsetReader<O>>;

    UInt16< 0> field1;
    UInt16< 2> filed2;
}; // class LocalFileHeader

int main(int argc, const char * argv[]) {
    std::ifstream myfile;
    myfile.open ("file.bin", std::ios::in | std::ios::binary);

    LocalFileHeader lfr = LocalFileHeader();
    // How do I use the parser to read from my file?
    return 0;
}

0 个答案:

没有答案