Rust 有办法将几个字节转换为数字吗? [重复]

问题描述 投票:0回答:2

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

我想避免使用

transmute
,但最重要的是达到最大性能。

numbers type-conversion rust
2个回答
28
投票

A

u32
为 4 个字节,您 may 能够使用
std::mem::transmute
[u8; 4]
解释为
u32
,但是:

  • 谨防对齐
  • 谨防字节序

自 Rust 1.32 (Jan 2019) 起,就有了标准库函数:

以及他们的同等

to_xx_bytes
与他们一起去。

否则,无依赖解决方案就是简单地执行数学运算,按照 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)
}

它编译成相当高效的代码。

最后,在旧版本的 Rust 上,如果可以选择依赖项,则也可以使用 byteorder 板条箱。


17
投票

T::from_str_radix
可以从字符串转换(您可以选择基数,
T
可以是任何整数类型)。

要将整数转换为

String
,您可以使用
format!
:

format!("{:x}", 42) == "2a"
format!("{:X}", 42) == "2A"

要将整数重新解释为字节,只需使用

byte_order
板条箱。


旧答案,我不再建议这样做:

如果您想在

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

另请注意,Rust 有

to_be
to_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
© www.soinside.com 2019 - 2024. All rights reserved.