4

我正在寻找一个将被复制到 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];

作为参考,目标函数原型为:

spi::setup_block(block: &[u8]);
4

3 回答 3

6

你可以通过transmute走不安全的路线,但我不推荐它。我不会保证 C 风格的版本在小端和大端机器上做同样的事情。

就个人而言,我会将块迭代器放在切片上。

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];
}
于 2021-03-18T16:45:00.340 回答
1

您可以使用类似于第二种方法的方法(将u16数组转换为u8指针)。

let color: u16 = 0x0102;
let mut block: [ u16; 128 ] = [ color; 128 ];
let mut block = unsafe { 
    core::slice::from_raw_parts_mut( block.as_mut_ptr( ) as *mut u8, block.len( ) * 2 ) 
};

请注意endianness此解决方案,它可能无法在您的目标架构上执行您想要的操作。

于 2021-03-18T20:09:00.313 回答
0
for chunk in block.chunks_exact_mut(2) {
    chunk.copy_from_slice(&color.to_be_bytes());
}
于 2021-03-19T09:46:16.160 回答