#序列化 #反序列化 #流 #字节缓冲区

手动序列化器

简单手动字节缓冲区序列化与反序列化工具

2 个不稳定版本

0.1.0 2022年12月20日
0.0.0 2022年12月10日

1584编码

每月 下载 21
2 个 crate 中使用 (通过 winres-edit)

Apache-2.0 OR MIT

25KB
394

手动序列化器

手动缓冲区处理序列化工具

Crates.io Crates.io

概述

当您需要从 u8 缓冲区快速手动提取数据结构时,此 crate 非常有用。这在解析具有复杂数据布局的第三方自定义二进制数据文件时非常有用,因为这些文件难以使用现有的序列化器或具有 #[repr(packed)] (由于对齐问题,这些处理可能比较困难) 的结构体进行序列化时非常有用。

除了加载和存储 u8,u16,u32,u64 基本类型的常用函数外,此序列化器还提供了以下辅助函数

  • 处理 u16le 数组的函数
  • 提取 u16 空终止字符串的函数(如 PCWSTR - 用于 Windows 数据结构)
  • 定位到 N 字节边界的对齐函数(如 align_u32()

注意:此 crate 目前仅支持 小端 编码的基本类型。

示例


#[derive(Debug)]
pub struct Header {
    pub magic : usize,
    pub version : u16,
    pub payload : Vec<u8>,
}

impl TrySerialize for Header {
    type Error = Error;
    fn try_serialize(&self, dest: &mut Serializer) -> Result<()> {
        dest.try_align_u32()?;
        dest.try_store_u16le(self.magic as u16)?;
        dest.try_store_u16le(self.version)?;
        dest.try_store_u32le(self.payload.len() as u32)?;
        dest.try_store_u8_slice(&self.payload)?;
        Ok(())
    }
}

fn store() {
    let mut dest = Serializer::new(4096);
    let header = Header::default();
    dest.try_store(&header)?;
}

impl TryDeserialize for Header {
    type Error = Error;

    fn try_deserialize(src: &mut Deserializer) -> Result<Header> {
        src.try_align_u32()?;

        let magic = src.try_load_u16le()? as usize;
        let version = src.try_load_u16le()?;
        let payload_length = src.try_load_u32le()? as usize;
        let payload = src.try_load_u8_vec(payload_length)?.to_vec()?;

        Ok(Header{magic, version, payload})
    }
}

fn load(data: &[u8], offset: usize) -> Result<(u32,Header)>{
    let mut src = Deserializer::new(data);
    src.offset(offset)?;
    let signature = src.try_load_u32le()?;
    let header: Header = src.try_load()?;
    Ok((signature,header))
}

依赖关系

~280–740KB
~17K SLoC