我的编码功能是这个:
fn encode_login(packet: &str) {
let bytes = packet.as_bytes();
for (i, &element) in bytes.iter().enumerate() {
println!("Index: {}, Byte: {}", i, &element);
let decoded = (element ^ 0xC3) + 0xF;
println!("Decoded Byte: {}", decoded);
}
}
fn main() {
// let packet = "0123456789"; // Doesn't work
let packet = "abcdefghijklmnopqrstuvwxyz"; // Work
encode_login(packet);
}
当我使用字母时,程序会很好地对其进行加密,但是当我输入数字时,它会感到恐慌。我不知道为什么,我是Rust的新手,所以也许我做错了事。
答案 0 :(得分:3)
在调试模式下,锈迹斑斑的数学运算符将对溢出感到恐慌。在大多数情况下,这是很好的选择,但对于这种对字节的低级操作却不是您想要的。
对于您而言,此方法将使字符1
惊慌。实际上,此字符的字节值为0x31
和:
0x31 ^ 0xC3 = 0xf2
0xf2 + 0xF = 0x101 // bigger than a byte!
对于这种操作,Rust提供了两种便捷的方法:
Wrapping
type是另一种类型的wrapper,它将使所有操作都自动换行,而不会出现恐慌。wrapping_*
methods (eg. wrapping_add
)是具有显式包装语义的方法。还有checked_*
,overflowing_*
和saturating_*
方法,根据使用情况它们都有用,但没有包装类型。因此,在这种情况下,您只需使用wrapping_add
而不是+
。