#hex #字符串格式化 #格式化 #serde #字符串表示 #bytemuck #动态大小

easy-hex

一个易于使用的十六进制字符串格式化包装器

4个版本 (1个稳定版)

1.0.0 2023年12月5日
0.1.2 2023年6月20日
0.1.1 2023年6月20日
0.1.0 2023年6月18日

#403编码

每月 30次下载

MIT/Apache

27KB
606

Easy Hex

一个易于使用的十六进制字符串格式化包装器。

该库的目标是使任何字节数组的格式化或序列化为十六进制字符串变得非常容易。这包括向量、数组、切片等。示例

use easy_hex::Hex;

let hex = Hex([1, 16, 255]);
let json = serde_json::to_string(&hex).unwrap();
assert_eq!(json, r#""0110ff""#);

特性

  • 与实现 TryFrom<&[u8]>AsRef<[u8]> 的任何类型兼容。
  • 灵活的API,可以用于所有者和借用字节数容器。
  • 类型表示透明,允许在包装器和包装类型之间自由转换。
  • 可以包装动态大小类型。
  • 支持小写和大写十六进制。
  • 支持 serde:任何字节数组都可以轻松序列化为十六进制字符串。
  • 支持 std 格式化:任何字节数组都可以轻松格式化为十六进制字符串。
  • 支持 bytemuck:允许在包装器和包装类型之间安全转换,并允许将引用转换为包装器。

支持类型

此crate的API旨在支持尽可能多的类型

  • 支持所有 T: AsRef<[u8]> 的序列化。
  • 支持所有 T: TryFrom<&[u8]> 的反序列化。

这包括以下类型

  • Vec<u8>
  • [u8]
  • [u8;N]
  • Box<[u8]>
  • &[u8]
  • 其他引用类型,如 &Vec<u8>
  • 可变引用类型,如 &mut [u8; N]
  • 第三方类型,如 GenericArray<u8, N>(尽管此类型目前仅支持序列化,因为缺少 TryFrom 实现)

注意对动态大小类型(如 [u8])的显式支持。它们之所以可能,是因为 transparent 表示

use easy_hex::Hex;

let data: &[u8] = &[1, 2, 3];
let hex: &Hex<[u8]> = data.into();

相关性

已经有很多十六进制字符串格式化包了,这个包并不旨在比任何其他包都好。

这个包存在的主要原因是因为作者想要一个具有最小样板代码的、可重用的十六进制字符串序列化包。

性能

迄今为止,此包尚未应用特定的性能基准或优化。其实现的性质如下:

  • 它重用了 hex 包的编码和解码实现。
  • 它使用堆栈缓冲区来处理小的十六进制字符串或字节序列,但在转码时通常需要分配一个临时向量。

更多示例

将字节数组序列化为十六进制字符串

use easy_hex::Hex;
use serde_derive::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Example {
    // With wrapper
    array: Hex<[u8; 16]>,
    // Without wrapper
    #[serde(with = "easy_hex::serde")]
    vec: Vec<u8>
}

将字节格式化为十六进制

use easy_hex::{Hex, HexExt};

let data: [u8; 4] = [222, 173, 190, 239];

// Format by creating a temporary `&Hex<[u8; N]>`
let out = format!("contents of data: {}", data.as_hex());
assert_eq!(out, "contents of data: deadbeef");

// Format by wrapping the data explicitly
let hex = Hex(data);
println!("display: {hex}");
println!("debug: {hex:?}");
println!("explicit lower: {hex:x}");
println!("explicit upper: {hex:X}");

依赖项

~0.5–1.1MB
~24K SLoC