我有一个[u8; 16384]
和u16
。我将如何“临时转换”数组,以便一次设置两个u8
,第一个设置为最低有效字节,第二个设置为最高有效字节?
最佳答案
As DK suggests,您可能不应该真正使用unsafe
代码来重新解释内存...但是,如果您愿意的话,可以这样做。
如果您真的想走那条路,则应该注意一些陷阱:
&mut [u8]
并将其转换为&mut [u16]
,则它可能引用未正确对齐以作为u16
进行访问的某些内存区域。根据运行此代码的计算机的不同,这种未对齐的内存访问可能是非法的。在这种情况下,程序可能会以某种方式中止。例如,CPU可能会生成某种信号,操作系统对此信号进行响应以终止该进程。 如果您可以切换它(创建
u16
数组并在字节级别上临时处理它),则可以解决潜在的内存对齐问题:/// warning: The resulting byte view is system-specific
unsafe fn raw_byte_access(s16: &mut [u16]) -> &mut [u8] {
use std::slice;
slice::from_raw_parts_mut(s16.as_mut_ptr() as *mut u8, s16.len() * 2)
}
在大型字节序计算机上,此功能无法完成您想要的;您需要一个小尾数字节顺序。您只能将此作为针对低端字节序计算机的优化,并且需要坚持使用像DK那样的针对大端字节序或混合端字节序计算机的解决方案。