#hex-string #serde #utils #helper #manipulating

hex-serde-util

用于操作serde中十六进制字符串的辅助库

1个不稳定版本

0.1.0 2022年7月17日

#1269编码

MIT/Apache

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提供的数据类型。此外,这些类型还实现了某些方便的特性

  • DerefDerefMut

    在反序列化后,用户可以使用这些特性来获取实际的数字

    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);
    
  • FromInto

    在序列化之前,用户可以直接使用.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");
    
  • EqPartialEqOrdPartialOrd

    用于比较。

依赖项

~0.4–1MB
~23K SLoC