我正在尝试使用精灵x3解析二进制数据,并且我遇到了一个问题,我无法找到解析长度相关数据结构的方法,例如[uint32-counter] [counter-length data ]
是否可以将属性从一个解析器(x3 :: little_dword)传递到类似x3 :: repeat(???)[byte _]的内容?
答案 0 :(得分: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];
此规则不能嵌套,否则将覆盖局部变量。