#byte #endianness #codec #variables #cast #value

无std castflip

用于对数值变量、数组和结构进行小端和大端编码/解码的库

12个版本

0.1.11 2022年4月30日
0.1.10 2022年4月1日
0.1.9 2022年3月29日

#1954编码

每月下载量 34

MIT-0 许可证

125KB
1K SLoC

Castflip

Castflip 是一个用于对数值变量、数组和结构进行小端和大端编码/解码的 Rust 库。它们可以嵌套并按顺序排列。

[dependencies]
castflip = { version = "0.1" }

以下是一个示例。有关更多示例和文档,请参阅 https://docs.rs/castflip/

注意:在此包中,术语 encast 表示将多个字节解码为一个或多个值,术语 decast 表示将一个或多个变量编码为多个字节,术语 endian-flip 表示翻转值的大小端。

示例 1

在下面的示例中,方法 encastfbytes1 中的字节在大端(BE)中解码为类型为 UdpHdr 的变量 udp_hdr2。然后,方法 decastfudp_hdr2 中的结果值编码为在大端(BE)中的字节,并将它们存储在 bytes3 中。

use castflip::{Cast, Flip, EncastMem, DecastMem, BE};

#[repr(C)]
#[derive(Cast, Flip)]
struct UdpHdr {     // UDP: https://www.rfc-editor.org/rfc/rfc768.txt
    sport:  u16,    // UDP Source Port
    dport:  u16,    // UDP Destination Port
    len:    u16,    // UDP Length
    sum:    u16,    // UDP Checksum
}

// Input data: UDP header (8 bytes)
let bytes1: [u8; 8] = [0xC3, 0xC9, 0x00, 0x35, 0x00, 0x32, 0x82, 0x3F];

// Decode bytes `bytes1` to variable `udp_hdr2`.
let udp_hdr2 = bytes1.encastf::<UdpHdr>(BE)?;  // BE = Big-Endian

// Encode the resulting UDP header `udp_hdr2` to bytes `bytes3`.
let mut bytes3 = [0_u8; 8];
let size3 = bytes3.decastf::<UdpHdr>(&udp_hdr2, BE)?;

// Check the results (udp_hdr2)
assert_eq!(udp_hdr2.sport, 0xC3C9); // = 50121
assert_eq!(udp_hdr2.dport, 0x0035); // = 53 (DNS)
assert_eq!(udp_hdr2.len,   0x0032); // = 50
assert_eq!(udp_hdr2.sum,   0x823F);

// Check the results (bytes3)
assert_eq!(size3, 8);
assert_eq!(bytes3, bytes1);

在上面的示例中,#[derive(Cast)] 使 UdpHdr 的值可 encast / 可 decast,而 #[derive(Flip)] 使 UdpHdr 的值可 endian-flip

特性 EncastMem 提供了从内存中执行 encast 的方法,特性 DecastMem 提供了将 decast 返回到内存的方法。它们的方法的泛型类型参数可以在 Rust 编译器能够推断它们的情况下省略。以 'f' 结尾的方法会翻转结果的大端小端。字节的大端小端由其参数指定。 BEEndian::Big 的别名,表示大端。

除了这些特性之外,这个 crate 还提供了特性 EncastIO,它提供了从 io::Read 执行 encast 的方法,以及特性 DecastIO,它提供了将 decast 返回到 io::Write 的方法。

注意: UDP 是互联网协议套件中的基本协议之一。

有关更多示例和文档,请参阅 https://docs.rs/castflip/

依赖关系

~1.5MB
~35K SLoC