解析 – 给我一个二进制解析器 二进制数据解析器

所以,我得到这个数据。从网络套接字,或从一个文件。我拼凑在一起将解释数据的代码。读取一些字节,检查一些标志,一些字节表示多少数据。读入很多数据,冲洗,重复。

这个任务让我想起来解析源代码。我很喜欢lex / yacc和antlr,但是他们没有得到这个任务。你不能指定位和原始字节作为标记(好吧,也许你可以,但我不知道如何),你不能将它们哄到“读取两个字节,使它们成为一个无符号的16位整数,称之为n,然后读取n个字节。“

再次,当以系统的方式定义协议/数据格式的规格(并非全部都是这样)时,应该有系统的方法来读取根据协议格式化的数据。对?

必须有一个这样做的工具。

最佳答案
您可以尝试使用最近获得binary parsing tools(07)的Boost.Spirit(v2)版本,nativemixed parsers

// This is not a complete and useful example, but just illustration that parsing
// of raw binary to real data components is possible
typedef boost::uint8_t byte_t;
byte_t raw[16] = { 0 };
char const* hex = "01010000005839B4C876BEF33F83C0CA";
my_custom_hex_to_bytes(hex, raw, 16);

// parse raw binary stream bytes to 4 separate words
boost::uint32_t word(0);
byte_t* beg = raw;
boost::spirit::qi::parse(beg, beg + 16, boost::spirit::qi::dword, word))

更新:我发现类似的问题,Joel de Guzman在答复二进制解析器的可用性时确认:Can Boost Spirit be used to parse byte stream data?

转载注明原文:解析 – 给我一个二进制解析器 二进制数据解析器 - 代码日志