如何创建一个动态打印十六进制整数的宏,前导零

use*_*448 2 macros println rust

我正在寻找一个宏,它将显示一个十六进制数字,沿着前导零等于它的大小.例如,hex!(2u8)将打印$02(前导零)hex!(2u16)并将打印$0002(16位前导零)

这就是我现在所拥有的,但它仅适用于8位数字.它将显示大于8位的数字,但不会显示等于大小的前导零.我需要一种方法来替代整数的大小为2${:02X},但print!()宏需要一个字符串.

macro_rules! hex {
    ($val:expr) => {{
        println!("${:02X}", $val);
    }}
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*fan 5

而不是直接在某处打印它我建议使用包装结构,根据您的需要格式化内容:

use std::fmt;

#[derive(Debug)]
pub struct UpperHexLeadingZeroes<T>(pub T);
impl<T: fmt::UpperHex> fmt::Display for UpperHexLeadingZeroes<T> {
    fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result {
        use std::mem::size_of;
        let width = size_of::<T>() * 2; // 2 nibbles per byte
        write!(w, "${:0width$X}", self.0, width = width)
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

fn main() {
    println!("{}", UpperHexLeadingZeroes(2u8));
    println!("{}", UpperHexLeadingZeroes(2u16));
    println!("{}", UpperHexLeadingZeroes(2u32));
    println!("{}", UpperHexLeadingZeroes(2u64));
}
Run Code Online (Sandbox Code Playgroud)