2014-10-09 34 views
1

当然,还有更好的方法将二进制字符串转换为十六进制字符串吗?将二进制字符串转换为十六进制字符串与Rust中的前导零号码

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

为什么二进制字符串颠倒了?不应该是'1111000'来匹配'0x78'吗? – Dogbert 2014-10-09 19:00:00

回答

5

有一种方法做你想要在更加简洁的形式与std::num::from_str_radixformat!什么宏:

use std::num; 

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

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

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

相关问题