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

Rust 将二进制字符串转换为带前导零的十六进制字符串,rust,Rust,编者注:此代码示例来自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().enumera

编者注:此代码示例来自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
十六进制:00000078@4字节

我正在使用rustc 0.12.0-nightly

有一种方法可以使用宏以更简洁的形式完成您想要的操作:


可能有点模糊,但是
01$x
本质上意味着数字必须以十六进制形式打印,并用零填充,直到作为第二个参数传递的长度为止(第一个参数是基于零的索引)。

为什么二进制字符串是反向的?匹配
0x78
不应该是
1111000
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
}