0

我想知道是否有更好的方法来使用 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)))
4

0 回答 0