#hex #serde #macro #no-std

no-std hexutil

一个宏,用于实现与十六进制值一起工作的常见特性

1个不稳定版本

0.1.0 2020年5月1日

#2394 in 编码

MIT/Apache

32KB
540

Crates.io API Documentation Workflow Status

hexutil

实现二进制表示数据的常见特性。

使用impl_hex宏来实现ToHexFromHexDisplayFromStrSerializeDeserialize特性。

这可以通过返回一些字节的引用来实现

struct Test([u8; 42]);

hexutil::impl_hex!(Test, 42, |&self| &self.0, |data| Ok(Self(data)));

或者通过返回一些字节的值来实现

struct Test(u128);

hexutil::impl_hex!(Test, 16, |self| self.0.to_le_bytes(), |data| Ok(Self(
    u128::from_le_bytes(data)
)));

示例

struct Test(u16);

hexutil::impl_hex!(Test, 2, |self| self.0.to_le_bytes(), |data| Ok(Self(
    u16::from_le_bytes(data)
)));

let test = Test(0x1234);

// std::fmt::Display
assert_eq!(format!("{}", test), "3412");

// std::string::ToString
let hex = test.to_string();
assert_eq!(hex, "3412");

// std::convert::FromStr
let test: Test = hex.parse().unwrap();
assert_eq!(test, Test(0x1234));

// hexutil::ToHex
let hex = test.to_hex();
assert_eq!(hex, "3412");

// hexutil::FromHex
let test = Test::from_hex(hex.as_bytes()).unwrap();
assert_eq!(test, Test(0x1234));

// hexutil::ParseHex
let test: Test = hex.parse_hex().unwrap();
assert_eq!(test, Test(0x1234));

// serde::Serialize (with serializer.is_human_readable() == true)
let json = serde_json::to_string(&test).unwrap();
assert_eq!(json, r#""3412""#);

// serde::Deserialize (with deserializer.is_human_readable() == true)
let test: Test = serde_json::from_str(&json).unwrap();
assert_eq!(test, Test(0x1234));

// serde::Serialize (with serializer.is_human_readable() == false)
let bin = bincode::serialize(&test).unwrap();
assert_eq!(bin, [0x34, 0x12]);

// serde::Deserialize (with deserializer.is_human_readable() == false)
let test: Test = bincode::deserialize(&bin).unwrap();
assert_eq!(test, Test(0x1234));

预设

您可以附加一个要派生的预设列表

名称 描述
默认 convertserde
convert DisplayFromStr
Display 实现std::fmt::Display特性(启用to_string()方法)
FromStr 实现std::convert::FromStr特性(启用str.parse()方法)
serde SerializeDeserialize
Serialize 实现serde::Serialize特性
Deserialize 实现serde::Deserialize特性

仅派生ToHexFromHexSerializeDeserialize特性

struct Test([u8; 42]);

hexutil::impl_hex!(Test, 42, |self| self.0, |data| Ok(Self(data)), [serde]);

FromHex错误

第二个函数返回一个Result<Self, FromHexError>

struct Test([u8; 42]);

hexutil::impl_hex!(Test, 42, |self| self.0, |data| {
    Err(FromHexError::CustomStr("can't create this from hex"))
});

或者使用FromHexError::InvalidValue来显示默认消息

struct Test([u8; 42]);

hexutil::impl_hex!(Test, 42, |self| self.0, |data| Err(
    FromHexError::InvalidValue
));

单向

您还可以只实现一个方向

struct Test([u8; 42]);

hexutil::impl_to_hex!(Test, 42, |self| self.0);
struct Test([u8; 42]);

hexutil::impl_from_hex!(Test, 42, |data| Ok(Self(data)));

许可证

以下任一许可证下授权

由您自行选择。

贡献

除非您明确声明,否则您有意提交给作品包含在内的任何贡献,根据Apache-2.0许可证的定义,应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

约2MB
约44K SLoC