Rust二进制数据序列化库binout的使用,高效处理结构化数据的读写与存储
以下是关于Rust二进制数据序列化库binout的使用介绍和完整示例:
binout
是Piotr Beling开发的Rust库,用于低级别、可移植、面向字节的二进制编码、解码、序列化和反序列化整数和整数数组。它支持改进的VByte/LEB128格式以及简单的小端序原生序列化。
示例代码:
use binout::{VByte, Serializer};
let value = 123456u64;
let mut buff = Vec::new();
assert!(VByte::write(&mut buff, value).is_ok());
assert_eq!(buff.len(), VByte::size(value));
let read: u64 = VByte::read(&mut &buff[..]).unwrap();
assert_eq!(read, value);
完整示例demo:
use binout::{VByte, AsIs, Serializer};
fn main() {
// VByte示例
let vbyte_value = 123456u64;
let mut vbyte_buffer = Vec::new();
// 序列化
VByte::write(&mut vbyte_buffer, vbyte_value).unwrap();
println!("VByte encoded size: {}", vbyte_buffer.len());
// 反序列化
let vbyte_decoded: u64 = VByte::read(&mut &vbyte_buffer[..]).unwrap();
println!("VByte decoded value: {}", vbyte_decoded);
// AsIs示例
let asis_value = 123456u64;
let mut asis_buffer = Vec::new();
// 序列化
AsIs::write(&mut asis_buffer, asis_value).unwrap();
println!("AsIs encoded size: {}", asis_buffer.len());
// 反序列化
let asis_decoded: u64 = AsIs::read(&mut &asis_buffer[..]).unwrap();
println!("AsIs decoded value: {}", asis_decoded);
}
这个库提供了两种主要的序列化方式:
VByte
- 使用改进的VByte/LEB128格式进行压缩编码AsIs
- 使用简单的小端序原生格式
要使用这个库,可以在Cargo.toml中添加依赖:
binout = "0.3.0"
或者运行命令:
cargo add binout
完整示例demo(带注释):
use binout::{VByte, AsIs, Serializer};
fn main() {
// 初始化测试数据
let test_value = 123456u64;
// ===== VByte压缩编码示例 =====
println!("\n=== VByte编码测试 ===");
// 创建缓冲区
let mut vbyte_buffer = Vec::new();
// 序列化(编码)
VByte::write(&mut vbyte_buffer, test_value).unwrap();
println!("编码后大小: {}字节", vbyte_buffer.len());
// 反序列化(解码)
let decoded: u64 = VByte::read(&mut &vbyte_buffer[..]).unwrap();
println!("解码值: {}", decoded);
// ===== AsIs原生编码示例 =====
println!("\n=== AsIs编码测试 ===");
// 创建缓冲区
let mut asis_buffer = Vec::new();
// 序列化(原生小端序编码)
AsIs::write(&mut asis_buffer, test_value).unwrap();
println!("编码后大小: {}字节 (固定8字节)", asis_buffer.len());
// 反序列化
let decoded: u64 = AsIs::read(&mut &asis_buffer[..]).unwrap();
println!("解码值: {}", decoded);
// 比较两种编码方式的大小
println!("\n大小比较: VByte {}字节 vs AsIs {}字节",
vbyte_buffer.len(),
asis_buffer.len());
}
1 回复