Rust中如何将[u8; 32]转换为[u64; 8]以对比哈希结果?
将u8数组转换为u64数组的Rust实现及解释
核心逻辑
你遇到的是哈希结果的不同字节表示问题:32个u8的数组是哈希的原始字节输出,而8个u64的数组是将这些字节按4字节一组、小端字节序转换后的整数表示。
代码实现(标准库版本)
无需额外依赖,直接用Rust标准库完成转换:
fn main() { // 你的32位u8输入数组 let input_u8: [u8; 32] = [42, 218, 131, 193, 129, 154, 83, 114, 218, 225, 35, 143, 193, 222, 209, 35, 200, 16, 79, 218, 161, 88, 98, 170, 238, 105, 66, 138, 24, 32, 252, 218]; let mut output_u64 = [0u64; 8]; // 每4个u8转换为一个小端u32,再转成u64 for i in 0..8 { let slice = &input_u8[i*4..i*4+4]; // 固定长度切片转数组,unwrap安全(已知长度为4) let u32_val = u32::from_le_bytes(slice.try_into().unwrap()); output_u64[i] = u32_val as u64; } // 验证输出是否匹配目标数组 assert_eq!(output_u64, [3246643754, 1918081665, 2401493466, 600956609, 3662614728, 2858571937, 2319608302, 3673956376]); println!("转换成功:{:?}", output_u64); }
代码实现(byteorder库版本)
如果需要更简洁的字节流处理,可以使用byteorder库(需在Cargo.toml中添加byteorder = "1.4"):
use byteorder::{LittleEndian, ReadBytesExt}; use std::io::Cursor; fn main() { let input_u8: [u8; 32] = [42, 218, 131, 193, 129, 154, 83, 114, 218, 225, 35, 143, 193, 222, 209, 35, 200, 16, 79, 218, 161, 88, 98, 170, 238, 105, 66, 138, 24, 32, 252, 218]; let mut cursor = Cursor::new(input_u8); let mut output_u64 = [0u64; 8]; for val in &mut output_u64 { *val = cursor.read_u32::<LittleEndian>().unwrap() as u64; } assert_eq!(output_u64, [3246643754, 1918081665, 2401493466, 600956609, 3662614728, 2858571937, 2319608302, 3673956376]); println!("转换成功:{:?}", output_u64); }
关键细节解释
- 字节序确认:目标
u64的第一个值3246643754对应十六进制0xC183DA2A,而输入u8的前4个字节是0x2A, 0xDA, 0x83, 0xC1——这是典型的小端序(低字节在前)组合,所以必须用from_le_bytes或指定LittleEndian来转换。 - 类型对应关系:32个
u8正好分成8组4字节,每组对应一个32位整数(目标数组的u64只是用64位类型存储32位值,没有溢出风险)。 - 安全性说明:代码中
unwrap的使用是安全的,因为我们明确知道输入数组长度是32,每组切片长度固定为4;如果处理动态长度输入,建议替换为match或?进行错误处理。
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

