hex - 在十六进制表示中,Rust 显示u8切片

  显示原文与译文双语对照的内容
68 4

我需要将 &[u8] 转换为十六进制表示。例如[ A9, 45, FF, 00.. . ]

slices ( 所以我不能用 std::fmt::format ) 没有实现 trait std::fmt::UpperHexRust 具有 serialize::hex::ToHex 特性,它将 &[u8] 转换为十六进制字符串,但我需要具有独立字节的表示。

我可以以为 &[u8] 实现特性 UpperHex,但是我不确定这是如何规范化的。什么是最典型的方法?

时间:原作者:0个回答

139 1
Rust 1.26.0和更高版本

可以使用 :x?"用十六进制整数进行调试"格式化程序:

let data = b"hello";
println!("{:x?}", data);
println!("{:X?}", data);
[68, 65, 6c, 6c, 6f]
[68, 65, 6C, 6C, 6F]

它也可以与漂亮的修改器组合在一起:

let data = b"hello";
println!("{:#x?}", data);
println!("{:#X?}", data);
[
 0x68,
 0x65,
 0x6c,
 0x6c,
 0x6f
]
[
 0x68,
 0x65,
 0x6C,
 0x6C,
 0x6F
]

如果你需要更多的控制或者支持旧版本的Rust,请继续阅读。

Rust 1.0和更高版本
use std::fmt::Write;
fn main() {
 let mut s = String::new();
 for &byte in"Hello".as_bytes() {
 write!(&mut s,"{:X}", byte).expect("Unable to write");
 }
 println!("{}", s);
}

可以以通过在结构上实现一个格式化特性( 。fmt::Debugfmt::Displayfmt::LowerHexfmt::UpperHex,等等 ) 并具有一个小构造函数来设置这一点:

use std::fmt;
struct HexSlice<'a>(&'a [u8]);
impl<'a> HexSlice<'a> {
 fn new<T>(data: &'a T) -> HexSlice<'a> 
 where T:?Sized + AsRef<[u8]> + 'a
 {
 HexSlice(data.as_ref())
 }
}
//You can even choose to implement multiple traits, like Lower and UpperHex
impl<'a> fmt::Display for HexSlice<'a> {
 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 for byte in self.0 {
//Decide if you want to pad out the value here
 write!(f,"{:X}", byte)?;
 }
 Ok(())
 }
}
fn main() {
//To get a `String`
 let s = format!("{}", HexSlice::new("Hello"));
//Or print it directly
 println!("{}", HexSlice::new("world"));
//Works with 
 HexSlice::new("Hello");//string slices (&str)
 HexSlice::new(b"Hello");//byte slices (&[u8])
 HexSlice::new(&"World".to_string());//References to String
 HexSlice::new(&vec![0x00, 0x01]);//References to Vec<u8> 
}
原作者:
144 2

由于接受的答案不能在 Rust 1.0稳定工作,这是我的尝试。应该是 allocationless,因此速度相当快。这基本上是 [u8]的格式化程序,但是由于一致性规则,我们必须将 [u8] 包装为一个自定义类型 ByteBuf(&[u8]) 来使用它:

struct ByteBuf<'a>(&'a [u8]);
impl<'a> std::fmt::LowerHex for ByteBuf<'a> {
 fn fmt(&self, fmtr: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
 for byte in self.0 {
 try!( fmtr.write_fmt(format_args!("{:02x}", byte)));
 }
 Ok(())
 }
}

使用方法:

let buff = [0_u8; 24];
println!("{:x}", ByteBuf(&buff));
原作者:
...