首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将u32数组转换为适当的u8数组?

如何将u32数组转换为适当的u8数组?
EN

Stack Overflow用户
提问于 2022-06-15 12:04:25
回答 3查看 1K关注 0票数 0

我想把一个[u32; 4]转换成一个[u8; 16]

我知道可以使用按位操作从4 u8中获取16 u32。但是我想把数组转换到适当的位置。如何使用安全锈蚀或不安全锈蚀来做到这一点?

代码语言:javascript
运行
复制
let buffer: [u32; 4] = [1, 2, 3, 4];
let hash: [u8; 16]; // how to convert from buffer to hash?

背景信息:我正在计算一个128位的散列值,其中[u32; 4]是一个包含4 u32的缓冲区。我希望将数组转换为[u8; 16],作为最后的散列。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-15 12:13:33

你可能会被诱惑去做一个转变,但我建议你不要这样做,主要是因为它的能力,也就是说,最终的输出将取决于你的机器是大端还是小端:

代码语言:javascript
运行
复制
pub fn convert(data: &[u32; 4]) -> [u8; 16] {
    unsafe { std::mem::transmute(*data) }
}

相反,我只会用无聊的方式做(游乐场)

代码语言:javascript
运行
复制
pub fn convert(data: &[u32; 4]) -> [u8; 16] {
    let mut res = [0; 16];
    for i in 0..4 {
        res[4*i..][..4].copy_from_slice(&data[i].to_le_bytes());
    }
    res
}

如果需要大端,则将to_le_bytes()更改为to_be_bytes()。或者,如果您不关心这个问题,可以使用to_ne_bytes()来获得本地的endianness。

如果你担心性能(但你为什么要担心呢?)使用本机endianness为x86_64生成的代码尽可能好:

代码语言:javascript
运行
复制
playground::convert:
    movq    %rdi, %rax
    movups  (%rsi), %xmm0
    movups  %xmm0, (%rdi)
    retq
票数 4
EN

Stack Overflow用户

发布于 2022-06-15 12:10:35

使用unsafe,可以很容易地使用transmute()

代码语言:javascript
运行
复制
pub fn convert(v: [u32; 4]) -> [u8; 16] {
    unsafe { std::mem::transmute(v) }
}

我认为没有外部板条箱是没有有效的安全方法的。如果您可以采用外部板条箱,则可以使用bytemuck::cast()

代码语言:javascript
运行
复制
pub fn convert(v: [u32; 4]) -> [u8; 16] {
    bytemuck::cast(v)
}
票数 0
EN

Stack Overflow用户

发布于 2022-08-29 11:37:14

轻巧地,更简单/更地道地接受当前接受的答案:

代码语言:javascript
运行
复制
pub fn convert(source: &[u32; 4]) -> [u8; 16] {
    let mut dest = [0; 16];
    for (dest_c, source_e) in dest.chunks_exact_mut(4).zip(source.iter()) {
        dest_c.copy_from_slice(&source_e.to_le_bytes())
    }
    dest
}

基于异议,它似乎生成了更简单的ASM,可能是因为完全基于迭代器的迭代所产生的更强的假设(我已经检查了一个包含64k u32条目的数组,但我还没有彻底分析ASM )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72631065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档