在 Rust 中将二进制字符串转换为带有前导零的十六进制字符串
Posted
技术标签:
【中文标题】在 Rust 中将二进制字符串转换为带有前导零的十六进制字符串【英文标题】:Convert binary string to hex string with leading zeroes in Rust 【发布时间】:2014-10-09 18:29:22 【问题描述】:编者注:此代码示例来自 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
Hex: 00000078 @ 4 bytes
我正在使用 rustc 0.12.0-nightly
【问题讨论】:
为什么二进制字符串反了?不应该是1111000
来匹配0x78
吗?
【参考方案1】:
有一种方法可以使用std::u32::from_str_radix
和format!
宏以更简洁的形式执行您想要的操作:
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
本质上意味着该数字必须以十六进制形式打印,并用零填充,直到作为第二个参数(第一个从零开始索引)传递的长度。
【讨论】:
以上是关于在 Rust 中将二进制字符串转换为带有前导零的十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章