#byte-buffer #buffer #memory #byte #casting #memory-mapping

pkbuffer

用于任意转换和寻址的缓冲区对象!

6个版本 (3个重大更新)

0.4.2 2023年1月6日
0.4.1 2022年4月23日
0.4.0 2022年3月29日
0.3.0 2022年3月26日
0.1.0 2022年2月18日

#2000 in 算法

Download history 88/week @ 2024-03-13 116/week @ 2024-03-20 159/week @ 2024-03-27 131/week @ 2024-04-03 231/week @ 2024-04-10 121/week @ 2024-04-17 106/week @ 2024-04-24 114/week @ 2024-05-01 98/week @ 2024-05-08 122/week @ 2024-05-15 97/week @ 2024-05-22 118/week @ 2024-05-29 92/week @ 2024-06-05 129/week @ 2024-06-12 185/week @ 2024-06-19 314/week @ 2024-06-26

每月731次下载
用于 7 个crate(直接使用2个)

GPL-3.0 许可证

79KB
1K SLoC

PKBuffer

PKBuffer 是一个简单但灵活的缓冲区库,允许您将Rust对象转换为字节缓冲区。它源于多种内存解析场景,如可执行文件头解析和游戏ROM内存映射。其名称来源于在字节缓冲区上进行任意结构定义转换的魔法,以及我在当时逆向工程游戏 EarthBound 的实际情况。

您可以在这里阅读文档,并在测试文件中查看各种使用示例。变更日志可以在这里找到。


lib.rs:

PKBuffer 是一个用于将数据结构任意转换为内存段段的库!这包括非所有者内存的部分,例如检查当前正在运行的可执行文件的头部。它为读取和写入数据结构到任意字节缓冲区创建了一个接口。

例如

use pkbuffer::{Buffer, VecBuffer, Castable};

#[repr(packed)]
#[derive(Copy, Clone, Castable)]
struct Object {
   byte: u8,
   word: u16,
   dword: u32,
}

let mut buffer = VecBuffer::with_initial_size(std::mem::size_of::<Object>());
let object = buffer.get_mut_ref::<Object>(0).unwrap();
object.byte = 0x01;
object.word = 0x0302;
object.dword = 0x07060504;

assert_eq!(buffer, [1,2,3,4,5,6,7]);

Buffer 对象检索的任何对象都必须实现 Castable 特性。此特性确保对对象应用一系列属性。为了方便,提供了一个 派生宏

缓冲区对象是从 Buffer 特性派生出来的。此特性实现了切片对象的大部分功能以及派生缓冲区对象的派生数据转换能力。

缓冲区对象有两种形式:指针形式 (PtrBuffer) 和 分配形式 (VecBuffer)。每种结构都有其特定的用途。 PtrBuffer 用于非所有者数据,如内存中的任意位置,而 VecBuffer 的用途在于能够操作底层所有者数据。

VecBuffer非常有用,可以创建一个新的对象缓冲区。

use pkbuffer::{Buffer, VecBuffer};

let mut buffer = VecBuffer::new();
buffer.append_ref::<u8>(&0x1);
buffer.append_ref::<u16>(&0x0302);
buffer.append_ref::<u32>(&0x07060504);
assert_eq!(buffer, [1,2,3,4,5,6,7]);

依赖项

~2MB
~41K SLoC