6个版本
0.1.10 | 2022年4月1日 |
---|---|
0.1.6 | 2022年3月26日 |
#16 在 #flip
每月25次下载
在 castflip 中使用
14KB
234 行
Castflip
Castflip 是一个用于在little-endian和big-endian中编码和解码数字变量、数组和结构的Rust库。它们可以嵌套并按系列排列。
- 文档:https://docs.rs/castflip/
- 许可证:https://spdx.org/licenses/MIT-0.html
- 如何使用:将以下行添加到Cargo.toml
[dependencies]
castflip = { version = "0.1" }
以下是一个示例。有关更多示例和文档,请参阅 https://docs.rs/castflip/。
注意:在这个crate中,术语 encast
表示将多个字节的数字解码为一个或多个值,术语 decast
表示将一个或多个变量编码为多个字节,术语 endian-flip
表示翻转值(s)的字节序。
示例1
在下面的示例中,方法 encastf
将 bytes1
中的大端字节解码为变量 udp_hdr2
的类型 UdpHdr
。然后,方法 decastf
将 udp_hdr2
中的结果值编码为大端字节并存储在 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
~36K SLoC