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)
而不是直接在某处打印它我建议使用包装结构,根据您的需要格式化内容:
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)