我的编码函数是这样的:
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);
}
Run Code Online (Sandbox Code Playgroud)
当我使用字母时,程序会很好地对其进行加密,但是当我输入数字时,它会出现恐慌。我不知道为什么,我是 Rust 的新手,所以也许我做错了什么。
Rust 数学运算符在调试模式下会因溢出而恐慌。这在大多数情况下都很好,但不是您在这种字节低级操作中想要的。
在您的情况下,此方法会对角色感到恐慌1。事实上,这个字符的字节值是0x31和:
0x31 ^ 0xC3 = 0xf2
0xf2 + 0xF = 0x101 // bigger than a byte!
Run Code Online (Sandbox Code Playgroud)
对于此类操作,Rust 提供了两种便捷的方式:
Wrapping类型是另一种类型的包装器,这将使它的所有操作都包装而不是恐慌。wrapping_*方法(例如wrapping_add)是具有显式包装语义的方法。还有checked_*、overflowing_*和saturating_*方法,根据用例它们都很有用,但没有包装类型。因此,在您的情况下,您可以简单地使用wrapping_add而不是+.
| 归档时间: |
|
| 查看次数: |
2738 次 |
| 最近记录: |