gpt4 book ai didi

rust - 如何将 [u64;N] 转换为 [u8;8*N]?

转载 作者:行者123 更新时间:2023-12-05 01:26:43 29 4
gpt4 key购买 nike

我正在用 Rust 编写压缩算法。

我有一个将输入字节映射到输出的“转换表”(每个输出是一个 u64 是代码,一个 u8 是代码的长度,它不必是 8 的倍数).对于每个输入字节,我找到相应的输出并将代码移位到一个大的连续数组 u64 中。秒。然后我想写这个 u64 的数组s 到一个文件。

转换 [u64; WRITE_CHUNK_SIZE] 的最佳方式是什么?到 [u8; 8 * WRITE_CHUNK_SIZE]

正在循环 [u64; WRITE_CHUNK_SIZE] , 调用 to_be_bytes()在每个 u64 , 将每个字节写入 [u8; 8*WRITE_CHUNK_SIZE]我能做到最好吗?

我看到了 align_to 的例子这需要不安全,这似乎只是为了转换数据类型。我还看到了 this输出 Vec .不过,我认为这只会将问题推到后面,因为我仍然需要转换 Vec<u8>进入 [u8]写入文件。我错了吗?

最佳答案

bytemuck crate 提供了在不使用 unsafe 的情况下将一种类型重新解释为另一种类型的功能,只要这是安全的,因为两种类型都是“只是字节”(没有无效值和填充)。只需调用 bytemuck::cast 即可在任何整数数组类型之间进行转换,只要两种类型的总大小相同即可。 (或者,bytemuck::cast_slice 如果您有整数切片或整数数组。)

此类转换纯粹是改变类型,因此它们没有运行时成本。但是,它们不会将字节重新排序为特定的字节序,因此这会暴露您正在运行的机器的 native 字节序。在您的情况下,也许您可​​以重新排列表以比显式交换字节更有效地解决这个问题。如果你不能,那么循环中的 to_be_bytes 可能已经很好了。

const WRITE_CHUNK_SIZE: usize = 4;

fn main() {
let sixtyfours: [u64; WRITE_CHUNK_SIZE] = [1, 2, 3, 0x0102030405060708];
let eights: [u8; 8 * WRITE_CHUNK_SIZE] = bytemuck::cast(sixtyfours);
println!("{:?}", eights);
}

这会打印(在小端机器上):

[1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 8, 7, 6, 5, 4, 3, 2, 1]

关于rust - 如何将 [u64;N] 转换为 [u8;8*N]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70118148/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com