并将数字转换为字节数组?
我想避免使用
transmute
,但最重要的是达到最大性能。
A
u32
为 4 个字节,您 may 能够使用 std::mem::transmute
将 [u8; 4]
解释为 u32
,但是:
自 Rust 1.32 (Jan 2019) 起,就有了标准库函数:
u32::from_be_bytes([u8; 4]) -> u32
:来自大端。u32::from_le_bytes([u8; 4]) -> u32
:从小端开始。u32::from_ne_bytes([u8; 4]) -> u32
:来自本机字节序。以及他们的同等
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 板条箱。
T::from_str_radix
可以从字符串转换(您可以选择基数,T
可以是任何整数类型)。
要将整数转换为
String
,您可以使用 format!
:
format!("{:x}", 42) == "2a"
format!("{:X}", 42) == "2A"
要将整数重新解释为字节,只需使用
byte_order
板条箱。
旧答案,我不再建议这样做:
如果您想在
u32
和 [u8; 4]
之间进行转换(例如),您可以使用 transmute
,这就是它的用途。
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