#byte #codec #endianness #decoding #variables #flip #castflip

castflip_derive

为castflip提供派生宏

6个版本

0.1.10 2022年4月1日
0.1.6 2022年3月26日

#16#flip

每月25次下载
castflip 中使用

MIT-0 许可证

14KB
234

Castflip

Castflip 是一个用于在little-endian和big-endian中编码和解码数字变量、数组和结构的Rust库。它们可以嵌套并按系列排列。

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

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

注意:在这个crate中,术语 encast 表示将多个字节的数字解码为一个或多个值,术语 decast 表示将一个或多个变量编码为多个字节,术语 endian-flip 表示翻转值(s)的字节序。

示例1

在下面的示例中,方法 encastfbytes1 中的大端字节解码为变量 udp_hdr2 的类型 UdpHdr。然后,方法 decastfudp_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”结尾的方法会翻转结果的字节序。字节的字节序在它们的参数中指定。BEEndian::Big的别名,表示大端字节序。

除了这些特质外,该crate还有一个特质EncastIO,提供了从io::Readencast的方法,以及一个特质DecastIO,提供了将数据decastio::Write的方法。

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

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

依赖项

~1.5MB
~36K SLoC