为什么打印显示的字节数组乱序?

Why is printing an array of bytes shown out of order?

我正在编写一个接收 bytes::Bytes 实例的方法,该实例表示 Type/Length/Value 数据结构,其中字节 0 是类型,接下来的 4 个是长度,其余是值。我实施了一个单元测试,它的表现非常出乎意料。

给定方法:

fn split_into_packets(packet: &Bytes) -> Vec<Bytes> {
    let mut packets: Vec<Bytes> = Vec::new();
    let mut begin: usize = 1;
    while begin < packet.len() {
        let slice = &packet[1..5];
        print!("0: {} ", slice[0]);
        print!("1: {} ", slice[1]);
        print!("2: {} ", slice[2]);
        println!("3: {}", slice[3]);
        let size = u32::from_be_bytes(pop(slice));
        println!("{}", size);
    }
    return packets;
}

测试:

let mut bytes = BytesMut::with_capacity(330);
bytes.extend_from_slice(b"R\x52\x00\x00\x00\x08\x00");
let packets = split_into_packets(&bytes.freeze());

我在控制台上看到以下内容:

0: 82 1: 0 2: 0 3: 0

我预计会是:

0: 0 1: 0 2: 0 3: 82

这是怎么回事?我错过了什么?

fn split_into_packets(packet: &Bytes) -> Vec<Bytes> { // paket = "R\x52\x00\x00\x00\x08\x00"
    let mut packets: Vec<Bytes> = Vec::new();
    let mut begin: usize = 1;
    while begin < packet.len() {
        let slice = &packet[1..5]; // slice = "\x52\x00\x00\x00"
        print!("0: {} ", slice[0]); // "\x52\x00\x00\x00"
                                        ^^^^
                                        |  |
                                        +--+--- this is slice[0] = 0x52 = 82 (in decimal)
        print!("1: {} ", slice[1]); // "\x52\x00\x00\x00"                                 
                                            ^^^^
                                            |  |
                                            +--+--- this is slice[1] = 0x0 = 0 (in decimal)
        print!("2: {} ", slice[2]); // "\x52\x00\x00\x00"                                 
                                                ^^^^
                                                |  |
                                                +--+--- this is slice[2] = 0x0 = 0 (in decimal)
        println!("3: {}", slice[3]); // "\x52\x00\x00\x00"                                 
                                                     ^^^^
                                                     |  |
                                                     +--+--- this is slice[3] = 0x0 = 0 (in decimal)
        let size = u32::from_be_bytes(pop(slice));
        println!("{}", size);
    }
    return packets;
}

我希望以上解释了为什么在一个接一个地打印字节时得到 82, 0, 0, 0

所以,进入下一件事:我们如何将 4 个字节转换为 u32:要做到这一点,有两种可能性,它们对字节的解释方式不同:

  • from_be_bytes:将字节转换为 big-endian 中的 u32u32::from_be_bytes([0x12, 0x34, 0x56, 0x78])==0x12345678
  • from_le_bytes:将字节转换为 u32 in little-endianu32::from_le_bytes([0x78, 0x56, 0x34, 0x12])==0x12345678

对于字节顺序,您可以例如参考respective wikipedia page.