首页 文章

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

提问于
浏览
3

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

当然有一种更好的方法将二进制字符串转换为十六进制字符串比这个?

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

1 回答

  • 7

    有一种方法可以使用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 本质上意味着数字必须以十六进制形式打印,用零填充,直到作为第二个(第一个具有从零开始索引)参数传递的长度 .

相关问题