在 Rust 中将二进制字符串转换为带有前导零的十六进制字符串

Posted

技术标签:

【中文标题】在 Rust 中将二进制字符串转换为带有前导零的十六进制字符串【英文标题】:Convert binary string to hex string with leading zeroes in Rust 【发布时间】:2014-10-09 18:29:22 【问题描述】:

编者注:此代码示例来自 Rust 1.0 之前的版本,在语法上不是有效的 Rust 1.0 代码。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息。

肯定有比这更好的将二进制字符串转换为十六进制字符串的方法吗?

use std::num;

fn to_hex(val: &str, len: uint) 
    println!("Bin: ", val);
    let mut int_val = 0i;
    for (i,c) in val.chars().enumerate()       
        if c == '1' 
            int_val += num::pow(2i, i+1)/2;
        
    

    let f32_val = int_val as f32;
    let mut hex_val = std::f32::to_str_hex(f32_val).to_string();
    while hex_val.len() != len*2 
        hex_val = "0".to_string() + hex_val;
    
    println!("Hex:  @  bytes", hex_val, len);


fn main() 
    let value = "0001111";
    to_hex(value,4);

结果是

Bin: 0001111
Hex: 00000078 @ 4 bytes

我正在使用 rustc 0.12.0-nightly

【问题讨论】:

为什么二进制字符串反了?不应该是1111000来匹配0x78吗? 【参考方案1】:

有一种方法可以使用std::u32::from_str_radixformat! 宏以更简洁的形式执行您想要的操作:

use std::u32;

fn to_hex(val: &str, len: usize) -> String 
    let n: u32 = u32::from_str_radix(val, 2).unwrap();
    format!(":01$x", n, len * 2)


fn main() 
    println!("", to_hex("110011111111101010110010000100", 6))
    // prints 000033feac84

The format syntax 可能有点晦涩难懂,但01$x 本质上意味着该数字必须以十六进制形式打印,并用零填充,直到作为第二个参数(第一个从零开始索引)传递的长度。

【讨论】:

以上是关于在 Rust 中将二进制字符串转换为带有前导零的十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

格式字符串,带前导零的整数

如何打印带有前导零的二进制整数?

使用前导零将十六进制转换为二进制

如何将带有前导零的数字字符串转储为 yaml-cpp 中的有效 yaml 字符串?

使用vba在excel中复制带有前导零的数字文本

将 Long/ULong 转换为带有填充零的无符号十六进制字符串