我想使用现代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;
}