gpt4 book ai didi

rust - 在字符串中编码数字时为什么会得到 “Attempt to add with overflow”?

转载 作者:行者123 更新时间:2023-12-03 11:41:50 36 4
gpt4 key购买 nike

我的编码功能是这样的:

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);
}
当我使用字母时,程序会很好地对其进行加密,但是当我输入数字时,它会感到 panic 。我不知道为什么,我是Rust的新手,所以也许我做错了。

最佳答案

在 Debug模式下,Rust数学运算符会在溢出时 panic 。在大多数情况下,这是很好的选择,但对于字节的这种低级操作却不是您想要的。
在您的情况下,此方法会对字符1感到 panic 。实际上,此字符的字节值是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而不是 +

    关于rust - 在字符串中编码数字时为什么会得到 “Attempt to add with overflow”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62715081/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com