ULEB128 可变长度整数编码
ULEB128 variable-length integer encoding
我正在尝试编写一个 ULEB 128 解析器,它将采用无符号字节数组和 return 所需的值和移位。如果理解正确,如果我有一个 ubyte[] list = [0x1b, 0x02, 0x03]
那么我所做的就是查看 0x1b
并且这里的高位大于 0
,所以我必须读取下一个字节。最后它应该return 0x20b
移动2而不包括0x03
,因为第二个字节高位是0
。如果我的逻辑是正确的,我的主要问题是 D 中的字节操作,即如何检查高位或低位。
If my logic is correct, my main issue is byte manipulation in D i.e. how to check the high or low bits.
就像您在 C 中所做的那样。您可以使用按位与 (&
) 和二进制移位 (<<
)。
如果您需要一个示例作为参考,druntime 会这样做:
https://github.com/dlang/druntime/blob/0dfc0ce5aef1fde00713b56e9be99dcdfb04d171/src/rt/backtrace/dwarf.d#L490-L534
我正在尝试编写一个 ULEB 128 解析器,它将采用无符号字节数组和 return 所需的值和移位。如果理解正确,如果我有一个 ubyte[] list = [0x1b, 0x02, 0x03]
那么我所做的就是查看 0x1b
并且这里的高位大于 0
,所以我必须读取下一个字节。最后它应该return 0x20b
移动2而不包括0x03
,因为第二个字节高位是0
。如果我的逻辑是正确的,我的主要问题是 D 中的字节操作,即如何检查高位或低位。
If my logic is correct, my main issue is byte manipulation in D i.e. how to check the high or low bits.
就像您在 C 中所做的那样。您可以使用按位与 (&
) 和二进制移位 (<<
)。
如果您需要一个示例作为参考,druntime 会这样做:
https://github.com/dlang/druntime/blob/0dfc0ce5aef1fde00713b56e9be99dcdfb04d171/src/rt/backtrace/dwarf.d#L490-L534