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

时间:2020-07-03 12:05:27

标签: 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);
}

当我使用字母时,程序会很好地对其进行加密,但是当我输入数字时,它会感到恐慌。我不知道为什么,我是Rust的新手,所以也许我做错了事。

1 个答案:

答案 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而不是+