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

Spi*_*itz 3 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);
}
Run Code Online (Sandbox Code Playgroud)

结果是

Bin: 0001111
Hex: 00000078 @ 4 bytes
Run Code Online (Sandbox Code Playgroud)

我每晚使用rustc 0.12.0

Vla*_*eev 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
}
Run Code Online (Sandbox Code Playgroud)

格式语法可能有点模糊,但01$x实质上意味着数字必须以十六进制形式打印,用零填充,直到作为第二个(第一个具有从零开始索引)参数传递的长度.