我想知道是否有更好的方法来使用 kaitai-struct 解码以下内容。
数据规范
我有按以下顺序存储的可变长度数据:
lo: ULEB128 (33-bit number stored in ULEB128)
hi: ULEB128 (32-bit number stored in ULEB128 exists conditionally on the lsb of lo)
如果 lsblo
为 1:
+---------+------------+
| hi | lo |
+---------+--------+---+
| 64 - 33 | 32 - 1 | 0 |
+---------+--------+---+
| double | 1 |
+------------------+---+
否则:
+------------+
| lo |
+--------+---+
| 32 - 1 | 0 |
+--------+---+
| int | 0 |
---------+---+
如您所见,如果 lsblo
为 1 则hi
高 32 位lo
编码为双精度(ieee-754 64 位双精度),否则hi
不存在且高 32 位lo
编码为 int(32 -位有符号整数)。
什么(有时)有效
这是我能够想出的,但这是一个丑陋的黑客。abs(e-1023) >= 32
由于被迫使用位移而不是使用幂函数,它也无法正常工作(1 << x instead of 2^x)
。
seq:
- id: lo
type: vlq_base128_le
- id: hi
type: vlq_base128_le
if: (lo.value & 0x1) == 1
instances:
s:
value: (lo.value & 0x1) == 1 ? hi.value >> 31 : 0
e:
value: (lo.value & 0x1) == 1 ? (hi.value >> 20) & 0x7FF : 0
m:
value: (lo.value & 0x1) == 1 ? (hi.value & 0xFFFFF)*4294967296.0 + (lo.value >> 1) : 0
value:
value: (lo.value & 0x1) == 0 ? lo.value >> 1 : (s == 0 ? 1 : -1) * (1 + m / 4503599627370496.0) * (e > 1075 ? 1 << (e - 1023) : 1.0 / (1 << (1023 - e)))