为什么打印字节数组显示顺序不正确?



我正在编写一个方法,该方法接收表示类型/长度/值数据结构的bytes::Bytes实例,其中字节 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"Rx52x00x00x00x08x00");
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 = "Rx52x00x00x00x08x00"
let mut packets: Vec<Bytes> = Vec::new();
let mut begin: usize = 1;
while begin < packet.len() {
let slice = &packet[1..5]; // slice = "x52x00x00x00"
print!("0: {} ", slice[0]); // "x52x00x00x00"
^^^^
|  |
+--+--- this is slice[0] = 0x52 = 82 (in decimal)
print!("1: {} ", slice[1]); // "x52x00x00x00"                                 
^^^^
|  |
+--+--- this is slice[1] = 0x0 = 0 (in decimal)
print!("2: {} ", slice[2]); // "x52x00x00x00"                                 
^^^^
|  |
+--+--- this is slice[2] = 0x0 = 0 (in decimal)
println!("3: {}", slice[3]); // "x52x00x00x00"                                 
^^^^
|  |
+--+--- 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:在
  • 大端序中将字节转换为u32u32::from_be_bytes([0x12, 0x34, 0x56, 0x78])==0x12345678
  • from_le_bytes: 在
  • 小端序中将字节转换为u32u32::from_le_bytes([0x78, 0x56, 0x34, 0x12])==0x12345678

例如,您可以查阅相应的维基百科页面。

最新更新