Expand description

hex-serde-util

This crate provides a convenient approach to serializing/deserializing hex numbers with hex string of several formats.

Examples

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()
);

In summary, this crate provides a way to serialize/deserialize hex number from/to hex string with:

  • lower case without 0x prefix (1a for example)
  • upper case without 0x prefix (1A for example)
  • lower case with 0x prefix (0x1a for example)
  • upper case with 0x prefix (0x1A for example)

Generally, a project may only use one format of hex string, so just use an alias when using this crate in your project for convenience:

use hex_serde_util::HexUsizePrefixUpper as Hex;
use serde::Deserialize;

#[derive(Deserialize)]
struct AnalysisInfo {
    base_addr: Hex,
}

Necessity

serde provides many attributes for customizing serialization/deserialization, such as

  • [serde(serialize_with = "path")]
  • [serde(deserialize_with = "path")]
  • [serde(with = "module")]

These attributes can be used to work with hex strings, but there are some disadvantages:

  • Boilerplate needed

    You need to write some boilerplates in your project to use these attributes.

  • Can’t use these attributes when in a wrapper such as Option

    It is a common practice to use Option to wrap some fields if these type may be null when processing. However, if this field is designed to be a hex string, you have to write additional boilerplates for just serializing/deserializing those fields.

This crate handles these problems.

Usages

Just as shown above, users can just use types provided by this crate when serialize/deserialize hex strings with hex numbers. Moreover, these types also implements some convenient traits:

  • Deref, DerefMut

    After deserializing, users can just use these traits to get the real number:

    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

    Before serializing, users can just use .into to construct corresponding types.

  • Display

    When printing those structs with println!("{}");, the field is displayed as if it is a hex string:

    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

    For comparing.

Structs

Hex struct. You SHOULD NOT use this struct. Use corresponding type aliases instead.

Type Definitions

Type alias for Hex to use lower case without prefix for u8

Type alias for Hex to use lower case with prefix for u8

Type alias for Hex to use upper case with prefix for u8

Type alias for Hex to use upper case without prefix for u8

Type alias for Hex to use lower case without prefix for u16

Type alias for Hex to use lower case with prefix for u16

Type alias for Hex to use upper case with prefix for u16

Type alias for Hex to use upper case without prefix for u16

Type alias for Hex to use lower case without prefix for u32

Type alias for Hex to use lower case with prefix for u32

Type alias for Hex to use upper case with prefix for u32

Type alias for Hex to use upper case without prefix for u32

Type alias for Hex to use lower case without prefix for u64

Type alias for Hex to use lower case with prefix for u64

Type alias for Hex to use upper case with prefix for u64

Type alias for Hex to use upper case without prefix for u64

Type alias for Hex to use lower case without prefix for usize

Type alias for Hex to use lower case with prefix for usize

Type alias for Hex to use upper case with prefix for usize

Type alias for Hex to use upper case without prefix for usize