Rust有办法将几个字节转换成数字吗?

Wal*_*Air 2 numbers type-conversion rust

并将数字转换为字节数组?

我想避免使用transmute,但是最重要的是要达到最佳性能。

mca*_*ton 5

T::from_str_radix从字符串转换(你可以选择的基础,T可以是任意整数型)。

要将整数转换为a String,可以使用format!

format!("{:x}", 42) == "2a"
format!("{:X}", 42) == "2A"
Run Code Online (Sandbox Code Playgroud)

编辑:

如果要在u32和之间进行转换[u8; 4](例如),可以使用transmute,这就是它的用途。

还要注意,Rust具有to_beto_le处理持久性的功能:

unsafe { std::mem::transmute::<u32, [u8; 4]>(42u32.to_le()) } == [42, 0, 0, 0]
unsafe { std::mem::transmute::<u32, [u8; 4]>(42u32.to_be()) } == [0, 0, 0, 42]
unsafe { std::mem::transmute::<[u8; 4], u32>([0, 0, 0, 42]) }.to_le() == 0x2a000000
unsafe { std::mem::transmute::<[u8; 4], u32>([0, 0, 0, 42]) }.to_be() == 0x0000002a
Run Code Online (Sandbox Code Playgroud)

  • 我建议对原始转换使用字节顺序板条箱;这是一个安全的界面,并确保您正在考虑字节顺序。 (5认同)
  • 不要使用转换,这很危险,并且在字节序更改时会引起可移植性的头痛。如果您不想使用byte_order板条箱使用位操作(移位8位和或的倍数),则编译器会将其编译为有效的代码。 (2认同)

Mat*_* M. 5

一个u324字节的字节,您也许可以std::mem::transmute将a解释[u8; 4]u32

  • 提防对准
  • 提防字节序

不依赖解决方案只是执行数学,遵循Rob Pike的步骤

fn as_u32_be(array: &[u8; 4]) -> u32 {
    ((array[0] as u32) << 24) +
    ((array[1] as u32) << 16) +
    ((array[2] as u32) <<  8) +
    ((array[3] as u32) <<  0)
}

fn as_u32_le(array: &[u8; 4]) -> u32 {
    ((array[0] as u32) <<  0) +
    ((array[1] as u32) <<  8) +
    ((array[2] as u32) << 16) +
    ((array[3] as u32) << 24)
}
Run Code Online (Sandbox Code Playgroud)

它可以编译为合理有效的代码。

但是,如果依赖项是一个选项,则使用字节顺序板条箱更简单。

  • 就风格而言,我会使用 `|` 而不是 `+`(Rob Pike 似乎同意)。 (2认同)