我有一个[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那样的针对大端字节序或混合端字节序计算机的解决方案。

    10-04 14:01