- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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/
我是一名优秀的程序员,十分优秀!