1个不稳定版本
0.1.0 | 2022年7月17日 |
---|
#1269 在 编码
13KB
176 行
hex-serde-util
此crate提供了一种方便的方法来以多种格式的十六进制字符串序列化/反序列化十六进制数字。
示例
use hex_serde_util::{HexUsizeUpper, HexUsizeLower, HexUsizePrefixUpper, HexUsizePrefixLower};
let lower_data: HexUsizeLower = 0x1ausize.into();
let upper_data: HexUsizeUpper = 0x1ausize.into();
let prefix_lower_data: HexUsizePrefixLower = 0x1ausize.into();
let prefix_upper_data: HexUsizePrefixUpper = 0x1ausize.into();
assert_eq!(&serde_json::to_string(&lower_data).unwrap(), r#""1a""#);
assert_eq!(&serde_json::to_string(&upper_data).unwrap(), r#""1A""#);
assert_eq!(
&serde_json::to_string(&prefix_lower_data).unwrap(),
r#""0x1a""#
);
assert_eq!(
&serde_json::to_string(&prefix_upper_data).unwrap(),
r#""0x1A""#
);
assert_eq!(
serde_json::from_str::<HexUsizeLower>(r#""1a""#).unwrap(),
0x1ausize.into()
);
assert_eq!(
serde_json::from_str::<HexUsizeUpper>(r#""1A""#).unwrap(),
0x1ausize.into()
);
assert_eq!(
serde_json::from_str::<HexUsizePrefixLower>(r#""0x1a""#).unwrap(),
0x1ausize.into()
);
assert_eq!(
serde_json::from_str::<HexUsizePrefixUpper>(r#""0x1A""#).unwrap(),
0x1ausize.into()
);
总之,此crate提供了一种序列化/反序列化十六进制数字的方法,从/到十六进制字符串
- 小写,不带
0x
前缀(例如1a
) - 大写,不带
0x
前缀(例如1A
) - 小写,带
0x
前缀(例如0x1a
) - 大写,带
0x
前缀(例如0x1A
)
通常,一个项目可能只会使用一种格式的十六进制字符串,因此在使用此crate时,只需使用别名即可方便使用
use hex_serde_util::HexUsizePrefixUpper as Hex;
use serde::Deserialize;
#[derive(Deserialize)]
struct AnalysisInfo {
base_addr: Hex,
}
必要性
serde
提供了许多用于自定义序列化和反序列化的属性,例如
[serde(serialize_with= "path")]
[serde(deserialize_with= "path")]
[serde(with= "module")]
这些属性可用于处理十六进制字符串,但存在一些缺点
-
需要模板
您需要在项目中编写一些模板以使用这些属性。
-
在包装器(如
Option
)中无法使用这些属性这是一个常见的做法,当这些类型在处理时可能为空时,使用
Option
来包装某些字段。然而,如果这个字段被设计为十六进制字符串,您必须为仅序列化/反序列化这些字段编写额外的模板。
此crate处理这些问题。
用法
正如上面所示,用户可以在使用十六进制数字序列化/反序列化十六进制字符串时直接使用此crate提供的数据类型。此外,这些类型还实现了某些方便的特性
-
Deref
、DerefMut
在反序列化后,用户可以使用这些特性来获取实际的数字
use hex_serde_util::HexUsizePrefixUpper as Hex; let hex_wrapper = serde_json::from_str::<Hex>(r#""0x1A""#).unwrap(); let value = *hex_wrapper; // `value` is 26 with type `usize` assert_eq!(value, 26);
-
From
、Into
在序列化之前,用户可以直接使用
.into
来构建相应的类型。 -
显示
当使用
println!("{}");
打印这些结构体时,字段将显示为十六进制字符串use hex_serde_util::HexUsizePrefixUpper as Hex; let hex_wrapper: Hex = 0x1a.into(); let hex_str = hex_wrapper.to_string(); assert_eq!(&hex_str, "0x1A");
-
Eq
、PartialEq
、Ord
、PartialOrd
用于比较。
依赖项
~0.4–1MB
~23K SLoC