use std::convert::TryInto;
macro_rules! to_arr {
($slice:expr) => {
$slice.try_into().unwrap()
};
}
pub fn u8_to_u16(b: &[u8; 2]) -> u16 {
((b[0] as u16) << 8)
| (b[1] as u16)
}
pub fn u16_to_u32(b: &[u16; 2]) -> u32 {
((b[0] as u32) << 16)
| (b[1] as u32)
}
pub fn u32_to_u64(b: &[u32; 2]) -> u64 {
((b[0] as u64) << 16)
| (b[1] as u64)
}
pub fn u64_to_u128(b: &[u64; 2]) -> u128 {
((b[0] as u128) << 64)
| (b[1] as u128)
}
pub fn u8_to_u32(b: &[u8; 4]) -> u32 {
u16_to_u32(&[u8_to_u16(to_arr!(&b[0..=1])), u8_to_u16(to_arr!(&b[2..=3]))])
}
pub fn u8_to_u64(b: &[u8; 8]) -> u64 {
u32_to_u64(&[u8_to_u32(to_arr!(&b[0..=3])), u8_to_u32(to_arr!(&b[4..=8]))])
}
pub fn u8_to_u128(b: &[u8; 16]) -> u128 {
u64_to_u128(&[u8_to_u64(to_arr!(&b[0..=7])), u8_to_u64(to_arr!(&b[8..=15]))])
}
pub fn u16_to_u64(b: &[u16; 4]) -> u64 {
u32_to_u64(&[u16_to_u32(to_arr!(&b[0..=1])), u16_to_u32(to_arr!(&b[2..=3]))])
}
pub fn u16_to_u128(b: &[u16; 8]) -> u128 {
u64_to_u128(&[u16_to_u64(to_arr!(&b[0..=3])), u16_to_u64(to_arr!(&b[4..=8]))])
}
pub fn u32_to_u128(b: &[u32; 4]) -> u128 {
u64_to_u128(&[u32_to_u64(to_arr!(&b[0..=1])), u32_to_u64(to_arr!(&b[2..=3]))])
}