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

时间:2014-10-09 18:29:22

标签: rust

  

编者注:此代码示例来自1.0之前的Rust版本,并且在语法上不是有效的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

1 个答案:

答案 0 :(得分: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本质上意味着数字必须以十六进制形式打印,用零填充,直到作为第二个传递的长度(第一个基于零的索引)参数。