如果你有两个不同的u8
,传统的解决方案包括按位操作,特别是移位和按位或.这需要零堆分配,而且非常高效:
let number = ((vector[0] as u16) << 8) | vector[1] as u16;
还有一个图形说明:
A0 B0
+--------+ +--------+
|XXXXXXXX| |YYYYYYYY|
+-------++ +-------++
| |
A1 = A0 as u16 | B1 = B0 as u16 |
+---------------v+ +---------------v+
|00000000XXXXXXXX| |00000000YYYYYYYY|
+---------------++ +---------------++
| |
A2 = A1 << 8 | |
+---------------v+ |
|XXXXXXXX00000000| |
+---------------++ |
| +--+ |
+-------------->OR<--+
+-++
|
V = A2 | B1 |
+----------+----v+
|XXXXXXXXYYYYYYYY|
+----------------+
然而,你真的把问题看得太狭隘了.你没有两个u8
,你有一个&[u8]
.
在这种情况下,使用byteorder crate:
use byteorder::{ByteOrder, LittleEndian}; // 1.3.4
fn main() {
let data = [1, 16];
let v = LittleEndian::read_u16(&data);
println!("{}", v);
}
当您想要处理通过缓冲区的读取时,这显示了它的威力:
use byteorder::{BigEndian, LittleEndian, ReadBytesExt}; // 1.3.4
fn main() {
let data = [1, 16, 1, 2];
let mut current = &data[..];
let v1 = current.read_u16::<LittleEndian>();
let v2 = current.read_u16::<BigEndian>();
println!("{:?}, {:?}", v1, v2); // Ok(4097), Ok(258)
}
正如你所看到的,你需要意识到你输入的endianness个数据.
你也可以先用get a fixed-size array from your slice,然后用u16::from_le_bytes
.如果你有一个&[u8]
,想得到一个Vec<u16>
,你可以使用chunks_exact
(或array_chunks
)在适当大小的切片上迭代.
另见:
在您的原始帖子上免费查看代码:
这里不需要使用to_vec
,而是使用vec!
.
无需指定绝大多数类型.
let vector = [1u8, 16].to_vec();
let vector0 = format!("{:02x}", vector[0]);
let vector1 = format!("{:02x}", vector[1]);
let mut vector_combined = String::new();
vector_combined = vector_combined + &vector0.clone();
vector_combined = vector_combined + &vector1.clone();
let number = u16::from_str_radix(&vector_combined.to_string(), 16).unwrap();
添加时引用字符串之前,无需克隆字符串.
没有必要把String
换成...from_str_radix
人中还有String
人.
let vector0 = format!("{:02x}", vector[0]);
let vector1 = format!("{:02x}", vector[1]);
let mut vector_combined = String::new();
vector_combined = vector_combined + &vector0;
vector_combined = vector_combined + &vector1;
let number = u16::from_str_radix(&vector_combined, 16).unwrap();
不需要创建一个空的String
来追加,只需使用vector0
即可
let vector0 = format!("{:02x}", vector[0]);
let vector1 = format!("{:02x}", vector[1]);
let vector_combined = vector0 + &vector1;
let number = u16::from_str_radix(&vector_combined, 16).unwrap();
根本不需要创建两个字符串,一个可以:
let vector_combined = format!("{:02x}{:02x}", vector[0], vector[1]);
let number = u16::from_str_radix(&vector_combined, 16).unwrap();
当然,这仍然不是正确的解决方案,但它是better.