我正在编写一个方法,该方法接收表示类型/长度/值数据结构的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
:在- 大端序中将字节转换为
u32
:u32::from_be_bytes([0x12, 0x34, 0x56, 0x78])==0x12345678
- 小端序中将字节转换为
u32
:u32::from_le_bytes([0x78, 0x56, 0x34, 0x12])==0x12345678
from_le_bytes
: 在例如,您可以查阅相应的维基百科页面。