rust - 如何用重复的 u16 值填充 [u8] 数组?

标签 rust type-conversion type-punning rust-no-std

这个问题在这里已经有了答案:





How to slice a large Vec<i32> as &[u8]?

(2 个回答)



What is the correct way to write `Vec<u16>` content to a file?

(2 个回答)



How to convert vector of integers to and from bytes? [duplicate]

(2 个回答)


去年关闭。




我正在寻找一个将被复制到 RAM 中并发送到 LCD 驱动程序的数组。我希望能够传入一个颜色值( color: u16 )并使用它来填充数组。请注意,我使用的是 #![no_std]因为这适用于嵌入式应用程序。
显而易见的简单方法如下:

let mut block: [u8;256] = [0; 256];
for i in (0..block.len()).step_by(2) {
    block[i] = ((color && 0xFF00) >> 8) as u8;
    block[i+1] = (color && 0xFF) as u8;
}
由于我更多的个人经验来自 C,我想知道是否有任何更好的使用类型转换和转换的解决方案。例如,使用 Rust 初始化一个 u16 数组并转换为 u8 数组:
let block_u16: [u16; 128] = [color; 128]
let block_u8 = block_u16 as [u8; 256];
作为引用,目标函数原型(prototype)为:
spi::setup_block(block: &[u8]);

最佳答案

您可以通过 transmute 走不安全的路线,但我不会推荐它。我不会保证 C 风格的版本在小端和大端机器上做同样的事情。
就个人而言,我会将 block 迭代器放在切片上。

let color_bytes = color.to_le_bytes();
for word in block.chunks_exact_mut(2) {
    word[0] = color_bytes[0];
    word[1] = color_bytes[1];
}

关于rust - 如何用重复的 u16 值填充 [u8] 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66694747/

相关文章:

C# 'unsafe' 函数 — *(float*)(&result) 与 (float)(result)

rust - 如何在 Rust 中 fork/exec 转发所有参数的进程?

struct - 是否可以在 Rust 中声明本地匿名结构?

rust - 从 Rust 中的方法返回字符串

c++ - 在 C++ 中将 N 位 int 表示为十六进制

c - 两个 union 的算术,未定义的行为?

iterator - 在拥有这些函数的结构上应用一些函数

python - sy.sympify(str(expression)) 不等于表达式

c++ - 从 SQL Server 在 C++ native 客户端中返回 NULL 数据类型