我正试图将单个char
变量解析为ASCII值,但一直都遇到错误。
根据这篇文章的hansarap的答案,我认为这段代码应该有效:
let char_variable = 'a';
let shoud_be_u32_varaible = a.to_digit(10).unwrap();
但是这个代码总是会抛出这个错误:
线程'main'在'
None
值上调用Option::unwrap()
'时惊慌失措
为此,代码示例(hansarap答案中提供的示例(:
let a = "29";
for c in a.chars() {
println!("{:?}", c.to_digit(10));
}
这种.to_digit()
方法将起作用。
在这两种情况下,我都在.to_digit(10)
上对char
类型的变量使用,但在我的示例中,此代码会引发错误,对于hansarbat中的代码,这是有效的。有人能向我解释一下这些例子和我现在非常困惑而做错的事情之间的区别吗?
这两个例子都可以在那里找到:Rust操场例子
在这种情况下使用铸造可以吗?
let c = 'a';
let u = c as u32 - 48;
如果没有,你能告诉我,这样做的建议是什么吗?
好吧,我认为您混淆了类型转换和整数解析。
to_digit
是一种整数解析方法。它取字符,给定基数决定其在该基数中的值。因此,基10中的5是5,并且被存储为00000101
。11作为CCD_ 9存储在存储器中。
在类似铁锈的'c' as u32
中进行基元的类型铸造可能更符合您的要求。它与整数解析的不同之处在于;意思是";对于这个数字,你关心的是在内存中表示它的位的值。这意味着字符"c"被存储为1100011
(99(。
如果您只关心ascii字符,那么在进行转换之前也应该检查char.is_ascii()
。这样,您就可以将结果存储在u8
而不是u32
中
fn print_ascii_values_of_characters(string: &str) {
for c in string.chars() {
if c.is_ascii() {
println!("{:b}", c as u8) // :b prints the binary representation
}
}
}