pub trait SizedNumber
where
Self: Sized,
{
fn size() -> usize {
std::mem::size_of::<Self>()
}
fn from_bytes(bytes: &[u8]) -> Option<Self>;
fn to_bytes(&self) -> Vec<u8>;
}
pub trait EndianNumber: SizedNumber {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self>;
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8>;
}
impl SizedNumber for u8 {
fn size() -> usize {
1 }
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 1 {
return None;
}
Some(bytes[0])
}
fn to_bytes(&self) -> Vec<u8> {
vec![*self]
}
}
impl EndianNumber for u8 {
fn from_bytes_e(bytes: &[u8], _bigendian: bool) -> Option<Self> {
Self::from_bytes(bytes)
}
fn to_bytes_e(&self, _bigendian: bool) -> Vec<u8> {
self.to_bytes()
}
}
impl SizedNumber for i8 {
fn size() -> usize {
1
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 1 {
return None;
}
Some(bytes[0] as i8)
}
fn to_bytes(&self) -> Vec<u8> {
vec![(*self) as u8]
}
}
impl EndianNumber for i8 {
fn from_bytes_e(bytes: &[u8], _bigendian: bool) -> Option<Self> {
Self::from_bytes(bytes)
}
fn to_bytes_e(&self, _bigendian: bool) -> Vec<u8> {
self.to_bytes()
}
}
impl SizedNumber for u16 {
fn size() -> usize {
2
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 2 {
return None;
}
Some(Self::from_le_bytes([bytes[0], bytes[1]]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for u16 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 2 {
return None;
}
let slice = [bytes[0], bytes[1]];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}
impl SizedNumber for i16 {
fn size() -> usize {
2
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 2 {
return None;
}
Some(Self::from_le_bytes([bytes[0], bytes[1]]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for i16 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 2 {
return None;
}
let slice = [bytes[0], bytes[1]];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}
impl SizedNumber for u32 {
fn size() -> usize {
4
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 4 {
return None;
}
Some(Self::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3],
]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for u32 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 4 {
return None;
}
let slice = [bytes[0], bytes[1], bytes[2], bytes[3]];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}
impl SizedNumber for i32 {
fn size() -> usize {
4
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 4 {
return None;
}
Some(Self::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3],
]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for i32 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 4 {
return None;
}
let slice = [bytes[0], bytes[1], bytes[2], bytes[3]];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}
impl SizedNumber for f32 {
fn size() -> usize {
4
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 4 {
return None;
}
Some(Self::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3],
]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for f32 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 4 {
return None;
}
let slice = [bytes[0], bytes[1], bytes[2], bytes[3]];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}
impl SizedNumber for u64 {
fn size() -> usize {
8
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 8 {
return None;
}
Some(Self::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for u64 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 8 {
return None;
}
let slice = [
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}
impl SizedNumber for i64 {
fn size() -> usize {
8
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 8 {
return None;
}
Some(Self::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for i64 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 8 {
return None;
}
let slice = [
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}
impl SizedNumber for f64 {
fn size() -> usize {
8
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 8 {
return None;
}
Some(Self::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for f64 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 8 {
return None;
}
let slice = [
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}
impl SizedNumber for u128 {
fn size() -> usize {
16
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 16 {
return None;
}
Some(Self::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15],
]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for u128 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 16 {
return None;
}
let slice = [
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15],
];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}
impl SizedNumber for i128 {
fn size() -> usize {
16
}
fn from_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != 16 {
return None;
}
Some(Self::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15],
]))
}
fn to_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl EndianNumber for i128 {
fn from_bytes_e(bytes: &[u8], bigendian: bool) -> Option<Self> {
if bytes.len() != 16 {
return None;
}
let slice = [
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15],
];
if bigendian {
return Some(Self::from_be_bytes(slice));
}
Some(Self::from_le_bytes(slice))
}
fn to_bytes_e(&self, bigendian: bool) -> Vec<u8> {
if bigendian {
return self.to_be_bytes().to_vec();
}
return self.to_le_bytes().to_vec();
}
}