为什么打印显示的字节数组乱序?
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 中的 u32
:u32::from_be_bytes([0x12, 0x34, 0x56, 0x78])==0x12345678
from_le_bytes
:将字节转换为 u32
in little-endian:u32::from_le_bytes([0x78, 0x56, 0x34, 0x12])==0x12345678
对于字节顺序,您可以例如参考respective wikipedia page.
我正在编写一个接收 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 中的u32
:u32::from_be_bytes([0x12, 0x34, 0x56, 0x78])==0x12345678
from_le_bytes
:将字节转换为u32
in little-endian:u32::from_le_bytes([0x78, 0x56, 0x34, 0x12])==0x12345678
对于字节顺序,您可以例如参考respective wikipedia page.