Rust 将二进制字符串转换为带前导零的十六进制字符串
编者注:此代码示例来自Rust 1.0之前的版本,在语法上不是有效的Rust 1.0代码。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息 肯定有比这更好的方法将二进制字符串转换为十六进制字符串吗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
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
}