gpt4 book ai didi

macros - 如何制作一个动态打印带前导零的十六进制整数的宏

转载 作者:行者123 更新时间:2023-11-29 08:01:52 25 4
gpt4 key购买 nike

我正在寻找创建一个宏,它将以十六进制形式显示一种数字,前导零等于其大小。例如,hex!(2u8) 将打印 $02(前导零)而 hex!(2u16) 将打印 $0002(16 位前导零)

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

macro_rules! hex {
($val:expr) => {{
println!("${:02X}", $val);
}}
}

最佳答案

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

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

像这样使用它:

fn main() {
println!("{}", UpperHexLeadingZeroes(2u8));
println!("{}", UpperHexLeadingZeroes(2u16));
println!("{}", UpperHexLeadingZeroes(2u32));
println!("{}", UpperHexLeadingZeroes(2u64));
}

关于macros - 如何制作一个动态打印带前导零的十六进制整数的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46982715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com