0

我正在尝试使用 Spirit x3 解析二进制数据,但遇到了一个问题,我找不到解析长度相关数据结构的方法,例如 [uint32-counter][counter-length data]。

是否可以将属性从一个解析器 (x3::little_dword) 传递给 x3::repeat(???)[byte_] 之类的东西?

4

1 回答 1

0

您可以使用语义操作来存储预期的列表长度和解析的列表项的数量,然后在最后一个条目之前使重复项的解析器失败。未经测试的代码:

unsigned expected_length;
unsigned current_length;
auto store_length   = [&](auto& ctx) { expected_length = _attr(ctx); _pass(ctx) = (expected_length > 0); };
auto check_for_last = [&](auto& ctx) { _pass(ctx) = (++current_length < expected_length); };
auto last_item      = [&](auto& ctx) { _pass(ctx) = (current_length == expected_length); }

auto r = little_dword[store_length] >> +(my_item[check_for_last]) >> my_item[last_item];

此规则不能嵌套,否则局部变量将被覆盖。

于 2016-11-09T16:40:04.780 回答