其实代码最后一行实现了同样功能,但可以用来学习trait和macro



use std::convert::TryInto;
pub trait ReadInteger<T> {
fn from_le_bytes(data: &[u8]) -> T;
fn from_be_bytes(data: &[u8]) -> T;
}

macro_rules! impl_read_integer {
($($t:ty),+) => {
$(impl ReadInteger<$t> for $t {
fn from_le_bytes(data: &[u8]) -> $t {
<$t>::from_le_bytes(data.try_into().unwrap())
}
fn from_be_bytes(data: &[u8]) -> $t {
<$t>::from_be_bytes(data.try_into().unwrap())
}
})+
}
}

impl_read_integer!(u8, i16, i32, u32, i64);

fn read_integer<T: ReadInteger<T>>(data: &[u8]) -> T {
T::from_le_bytes(&data[..std::mem::size_of::<T>()])
}
fn main(){
let slice = &[1,2,0,0];
let int1 = read_integer::<i32>(slice);
println!("{}",int1);
println!("{}",u32::from_le_bytes([1,2,0,0]));
}


结果输出513

用计算器将513转为二进制并补齐两个8位:0000  0010  0000 0001,则最右边8位是1,左边8位是2