12个版本
0.1.11 | 2022年4月30日 |
---|---|
0.1.10 | 2022年4月1日 |
0.1.9 | 2022年3月29日 |
#1954 在 编码
每月下载量 34
125KB
1K SLoC
Castflip
Castflip 是一个用于对数值变量、数组和结构进行小端和大端编码/解码的 Rust 库。它们可以嵌套并按顺序排列。
- 文档: https://docs.rs/castflip/
- 许可证: https://spdx.org/licenses/MIT-0.html
- 如何使用:在 Cargo.toml 中添加以下行
[dependencies]
castflip = { version = "0.1" }
以下是一个示例。有关更多示例和文档,请参阅 https://docs.rs/castflip/。
注意:在此包中,术语 encast
表示将多个字节解码为一个或多个值,术语 decast
表示将一个或多个变量编码为多个字节,术语 endian-flip
表示翻转值的大小端。
示例 1
在下面的示例中,方法 encastf
将 bytes1
中的字节在大端(BE
)中解码为类型为 UdpHdr
的变量 udp_hdr2
。然后,方法 decastf
将 udp_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' 结尾的方法会翻转结果的大端小端。字节的大端小端由其参数指定。 BE
是 Endian
::Big
的别名,表示大端。
除了这些特性之外,这个 crate 还提供了特性 EncastIO
,它提供了从 io::Read
执行 encast
的方法,以及特性 DecastIO
,它提供了将 decast
返回到 io::Write
的方法。
注意: UDP 是互联网协议套件中的基本协议之一。
有关更多示例和文档,请参阅 https://docs.rs/castflip/。
依赖关系
~1.5MB
~35K SLoC