Rust二进制流处理库binary-stream的使用,高效读写与解析二进制数据流的Rust插件库
以下是关于Rust二进制流读写的完整示例和说明:
基础示例代码:
// 二进制流读写示例
use binary_stream::{BinaryWriter, BinaryReader};
use std::io::{Cursor, Seek, SeekFrom};
fn main() {
// 创建一个内存缓冲区
let mut buffer = Cursor::new(Vec::new());
// 写入二进制数据
let mut writer = BinaryWriter::new(&mut buffer);
writer.write_u32(0x12345678).unwrap(); // 写入32位整数
writer.write_f32(3.14).unwrap(); // 写入浮点数
writer.write_string("Hello").unwrap(); // 写入字符串
// 重置读取位置
buffer.seek(SeekFrom::Start(0)).unwrap();
// 读取二进制数据
let mut reader = BinaryReader::new(&mut buffer);
let num = reader.read_u32().unwrap(); // 读取32位整数
let pi = reader.read_f32().unwrap(); // 读取浮点数
let msg = reader.read_string().unwrap(); // 读取字符串
println!("Read values: 0x{:x}, {}, {}", num, pi, msg);
}
完整示例代码(带错误处理和更多数据类型):
// 完整二进制流处理示例
use binary_stream::{BinaryWriter, BinaryReader, Endian};
use std::io::{Cursor, Seek, SeekFrom};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 创建内存缓冲区
let mut buffer = Cursor::new(Vec::new());
// 2. 配置写入器(默认大端序)
let mut writer = BinaryWriter::with_endian(&mut buffer, Endian::Big);
// 3. 写入各种数据类型
writer.write_u8(0xAB)?; // 写入8位无符号整数
writer.write_i16(-1024)?; // 写入16位有符号整数
writer.write_u32(0xDEADBEEF)?; // 写入32位无符号整数
writer.write_f64(3.1415926535)?; // 写入64位浮点数
writer.write_string("Rust")?; // 写入UTF-8字符串
writer.write_bytes(&[0x01, 0x02, 0x03])?; // 写入字节数组
// 4. 重置读取位置
buffer.seek(SeekFrom::Start(0))?;
// 5. 配置读取器(与大端序写入器匹配)
let mut reader = BinaryReader::with_endian(&mut buffer, Endian::Big);
// 6. 读取并验证数据
assert_eq!(reader.read_u8()?, 0xAB);
assert_eq!(reader.read_i16()?, -1024);
assert_eq!(reader.read_u32()?, 0xDEADBEEF);
assert!((reader.read_f64()? - 3.1415926535).abs() < f64::EPSILON);
assert_eq!(reader.read_string()?, "Rust");
assert_eq!(reader.read_bytes(3)?, vec![0x01, 0x02, 0x03]);
println!("All data read successfully!");
Ok(())
}
主要功能特点:
- 支持大端序(Big-Endian)和小端序(Little-Endian)数据读写
- 提供完整的基本数据类型支持:u8, i16, u32, f32, f64等
- 支持字符串和字节数组的直接读写
- 基于标准库的std::io::Read和std::io::Write trait实现
- 源自binary_rw crate的派生实现
安装方法:
- 在项目目录运行命令:
cargo add binary-stream
- 或者在Cargo.toml中添加依赖:
binary-stream = "10.0.0"
注意事项:使用时请查阅官方文档确认最新版本号。
1 回复
Rust二进制流处理库binary-stream的使用指南
binary-stream是一个高效的Rust库,专门用于读写和解析二进制数据流。它提供了简单直观的API来处理各种二进制数据格式,特别适合网络协议解析、文件格式处理等场景。
主要特性
- 高效的二进制数据读写操作
- 支持大端序和小端序
- 类型安全的API设计
- 零拷贝操作优化
- 支持异步I/O操作
安装
在Cargo.toml中添加依赖:
[dependencies]
binary-stream = "0.3"
基本使用方法
创建写入流
use binary_stream::{BinaryWriter, Endian};
let mut writer = BinaryWriter::new(Endian::Big);
writer.write_u8(0x42); // 写入1字节无符号整数
writer.write_i16(-100); // 写入2字节有符号整数
writer.write_f32(3.14); // 写入4字节浮点数
writer.write_string("Hello"); // 写入字符串
let data = writer.into_bytes(); // 获取最终字节数据
创建读取流
use binary_stream::{BinaryReader, Endian};
let data = vec![0x42, 0x00, 0x9C, 0x40, 0x48, 0x65, 0x6C, 0x6C, 0x6F];
let mut reader = BinaryReader::from_bytes(&data, Endian::Big);
let num1 = reader.read_u8().unwrap(); // 读取1字节无符号整数
let num2 = reader.read_i16().unwrap(); // 读取2字节有符号整数
let float = reader.read_f32().unwrap(); // 读取4字节浮点数
let string = reader.read_string().unwrap(); // 读取字符串
println!("u8: {}, i16: {}, f32: {}, string: {}", num1, num2, float, string);
高级用法
处理自定义结构
use binary_stream::{BinaryWriter, BinaryReader, Endian, Serializable};
#[derive(Debug)]
struct Point {
x: f32,
y: f32,
}
impl Serializable for Point {
fn write(&self, writer: &mut BinaryWriter) {
writer.write_f32(self.x);
writer.write_f32(self.y);
}
fn read(reader: &mut BinaryReader) -> Self {
Point {
x: reader.read_f32().unwrap(),
y: reader.read_f32().unwrap(),
}
}
}
// 写入Point结构
let point = Point { x: 1.0, y: 2.0 };
let mut writer = BinaryWriter::new(Endian::Little);
writer.write_serializable(&point);
let data = writer.into_bytes();
// 读取Point结构
let mut reader = BinaryReader::from_bytes(&data, Endian::Little);
let read_point: Point = reader.read_serializable();
println!("Read point: {:?}", read_point);
异步处理
use binary_stream::{AsyncBinaryWriter, AsyncBinaryReader, Endian};
use tokio::io::{AsyncWriteExt, AsyncReadExt};
async fn async_example() {
let mut writer = AsyncBinaryWriter::new(Endian::Big);
writer.write_u16(0x1234).await.unwrap();
writer.write_string("Async").await.unwrap();
let mut buffer = Vec::new();
writer.into_inner().read_to_end(&mut buffer).await.unwrap();
let mut reader = AsyncBinaryReader::from_bytes(&buffer, Endian::Big);
let num = reader.read_u16().await.unwrap();
let text = reader.read_string().await.unwrap();
println!("Async read: {}, {}", num, text);
}
性能优化技巧
- 对于已知长度的数据,预分配缓冲区:
let mut writer = BinaryWriter::with_capacity(1024, Endian::Little);
- 批量写入数据:
writer.write_bytes(&[0x01, 0x02, 0x03]);
- 使用零拷贝操作:
let slice = reader.read_slice(4).unwrap(); // 不复制数据,直接引用原始缓冲区
完整示例demo
下面是一个结合了基本读写和自定义结构处理的完整示例:
use binary_stream::{BinaryWriter, BinaryReader, Endian, Serializable};
// 自定义数据结构
#[derive(Debug, PartialEq)]
struct User {
id: u32,
name: String,
active: bool,
balance: f64,
}
impl Serializable for User {
fn write(&self, writer: &mut BinaryWriter) {
writer.write_u32(self.id);
writer.write_string(&self.name);
writer.write_bool(self.active);
writer.write_f64(self.balance);
}
fn read(reader: &mut BinaryReader) -> Self {
User {
id: reader.read_u32().unwrap(),
name: reader.read_string().unwrap(),
active: reader.read_bool().unwrap(),
balance: reader.read_f64().unwrap(),
}
}
}
fn main() {
// 创建用户数据
let user = User {
id: 42,
name: "Alice".to_string(),
active: true,
balance: 123.45,
};
// 写入二进制数据
let mut writer = BinaryWriter::with_capacity(128, Endian::Little);
writer.write_serializable(&user);
let data = writer.into_bytes();
// 读取二进制数据
let mut reader = BinaryReader::from_bytes(&data, Endian::Little);
let read_user: User = reader.read_serializable();
// 验证数据
println!("Original: {:?}", user);
println!("Read: {:?}", read_user);
assert_eq!(user, read_user);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_user_serialization() {
let user = User {
id: 1001,
name: "Bob".to_string(),
active: false,
balance: 99.99,
};
let mut writer = BinaryWriter::new(Endian::Big);
writer.write_serializable(&user);
let data = writer.into_bytes();
let mut reader = BinaryReader::from_bytes(&data, Endian::Big);
let read_user: User = reader.read_serializable();
assert_eq!(user, read_user);
}
}
这个完整示例展示了如何:
- 定义自定义数据结构
- 实现Serializable trait
- 使用预分配缓冲区写入数据
- 从二进制流中读取数据
- 包含单元测试验证功能
binary-stream库通过其简洁的API和高效的实现,使得Rust中的二进制数据处理变得简单而高效。无论是简单的数据类型还是复杂的二进制协议,都能轻松应对。