2 个不稳定版本
0.4.0 | 2020年3月6日 |
---|---|
0.3.0 | 2019年10月2日 |
#1650 in 编码
2,235 每月下载量
在 shards 中使用
23KB
296 行
wasabi_leb128
读取和写入可变长度 LEB128 数字格式。例如
use wasabi_leb128::{ReadLeb128, WriteLeb128};
// Vec<u8> as byte-oriented reader/writer.
let mut buf = Vec::new();
// Encoding/writing a u16 as an LEB128 byte sequence.
let original_value: u16 = 128;
buf.write_leb128(original_value).unwrap();
assert_eq!(buf, [0x80, 0x01]);
// Decoding/reading an LEB128 number back to a u16.
let value: u16 = buf.as_slice().read_leb128().unwrap();
assert_eq!(value, original_value);
更多信息,请参阅
lib.rs
:
读取和写入可变长度 LEB128 数字格式。
LEB128 ("小端基 128") 被用于,例如在 DWARF 调试信息 (见附录 4 中的 C 伪代码) 和 WebAssembly 二进制格式 中。
示例
use wasabi_leb128::{ReadLeb128, WriteLeb128};
// Vec<u8> as byte-oriented reader/writer.
let mut buf = Vec::new();
// Encoding/writing a u16 as an LEB128 byte sequence.
let original_value: u16 = 128;
buf.write_leb128(original_value).unwrap();
assert_eq!(buf, [0x80, 0x01]);
// Decoding/reading an LEB128 number back to a u16.
let (value, bytes_read): (u16, usize) = buf.as_slice().read_leb128().unwrap();
assert_eq!(value, original_value);
有关更多信息,请参阅 ReadLeb128
和 WriteLeb128
特性。
相关工作
其他开源 LEB128 数字实现
- LLVM: http://llvm.net.cn/doxygen/LEB128_8h_source.html
- 请注意,
decodesSLEB128()
似乎没有溢出检查!?
- 请注意,
- V8: https://github.com/v8/v8/blob/4b9b23521e6fd42373ebbcb20ebe03bf445494f9/src/wasm/decoder.h#L329
- 注意一些巧妙的工程:基于模板的展开,处理有符号和无符号以及不同大小,并在单个模板中正确进行溢出检查。
parity-wasm
crate: https://github.com/paritytech/parity-wasm/blob/556a02a6d2e816044d2e486bf78123a9bc0657f5/src/elements/primitives.rs#L35leb128
crate: https://github.com/gimli-rs/leb128
此 crate 与现有 Rust 实现在 parity-wasm
和 leb128
之间的差异
- 适用于所有原始整数(而不仅仅是
u64 或
i64
)。 - 一个单一的、合并的实现,适用于有符号/无符号以及所有大小(归功于
num_traits
)。 - 在解析时对所有目标类型进行适当的溢出检查。
- (希望如此:)易于理解,内联注释和说明。
依赖项
~155KB