当我在字符串中编码数字时,为什么会出现“尝试添加溢出”?

Kol*_*lzy 0 rust

我的编码函数是这样的:

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 的新手,所以也许我做错了什么。

mca*_*ton 6

Rust 数学运算符在调试模式下会因溢出而恐慌。这在大多数情况下都很好,但不是您在这种字节低级操作中想要的。

在您的情况下,此方法会对角色感到恐慌1。事实上,这个字符的字节值是0x31和:

0x31 ^ 0xC3 = 0xf2
0xf2 + 0xF = 0x101 // bigger than a byte!
Run Code Online (Sandbox Code Playgroud)

对于此类操作,Rust 提供了两种便捷的方式:

因此,在您的情况下,您可以简单地使用wrapping_add而不是+.