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

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

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

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

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

时间: 原作者:

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



原作者:
...