首页 > 解决方案 > 为什么 to_be_bytes() 和 to_le_bytes() 与我在这里期望的相反?

问题描述

也许问题应该是“为什么我希望 to_be_bytes() 和 to_le_bytes() 在这里做相反的事情?”,但无论如何,情况如下:

fn main() {
    let buf: [u8; 2048] // Buffer I use to receive UDP messages

    let (_, entry, _) = unsafe { buf[14..].align_to::<u16>() };
    // In memory entry looks like: 00 44 16 15   21 04 03 5a   03 67 03 6a   03 64 88 91

    let [first, second] = entry[0].to_be_bytes();
    
    assert_eq!(first, 0x44);
    assert_eq!(second, 0x00);
}

不应该是相反的吗?大字节序不是像在内存中保留顺序一样吗?

标签: rustendiannessbytebuffer

解决方案


Big endian 意味着首先存储(或传输)高字节,即在最低地址。英特尔处理器是小端的,这意味着低字节存储在低地址中。

每个都有一些优点,但通常首选大端,这就是为什么网络协议和可移植数据格式通常是大端的原因。为了与旧版本兼容,英特尔仍然是小端。一些 CPU 具有可以在两者之间切换的模式,但英特尔从未这样做过。


推荐阅读