1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3pub enum ByteOrder {
4 LittleEndian,
5 BigEndian,
6}
7
8impl ByteOrder {
9 pub fn magic(self) -> [u8; 2] {
11 match self {
12 Self::LittleEndian => *b"II",
13 Self::BigEndian => *b"MM",
14 }
15 }
16
17 pub fn read_u16(self, bytes: [u8; 2]) -> u16 {
19 match self {
20 Self::LittleEndian => u16::from_le_bytes(bytes),
21 Self::BigEndian => u16::from_be_bytes(bytes),
22 }
23 }
24
25 pub fn read_u32(self, bytes: [u8; 4]) -> u32 {
27 match self {
28 Self::LittleEndian => u32::from_le_bytes(bytes),
29 Self::BigEndian => u32::from_be_bytes(bytes),
30 }
31 }
32
33 pub fn read_u64(self, bytes: [u8; 8]) -> u64 {
35 match self {
36 Self::LittleEndian => u64::from_le_bytes(bytes),
37 Self::BigEndian => u64::from_be_bytes(bytes),
38 }
39 }
40
41 pub fn read_f64(self, bytes: [u8; 8]) -> f64 {
43 f64::from_bits(self.read_u64(bytes))
44 }
45
46 pub fn write_u16(self, value: u16) -> [u8; 2] {
48 match self {
49 Self::LittleEndian => value.to_le_bytes(),
50 Self::BigEndian => value.to_be_bytes(),
51 }
52 }
53
54 pub fn write_u32(self, value: u32) -> [u8; 4] {
56 match self {
57 Self::LittleEndian => value.to_le_bytes(),
58 Self::BigEndian => value.to_be_bytes(),
59 }
60 }
61
62 pub fn write_u64(self, value: u64) -> [u8; 8] {
64 match self {
65 Self::LittleEndian => value.to_le_bytes(),
66 Self::BigEndian => value.to_be_bytes(),
67 }
68 }
69
70 pub fn write_f64(self, value: f64) -> [u8; 8] {
72 self.write_u64(value.to_bits())
73 }
74
75 pub fn write_f32(self, value: f32) -> [u8; 4] {
77 self.write_u32(value.to_bits())
78 }
79
80 pub fn write_i16(self, value: i16) -> [u8; 2] {
82 self.write_u16(value as u16)
83 }
84
85 pub fn write_i32(self, value: i32) -> [u8; 4] {
87 self.write_u32(value as u32)
88 }
89
90 pub fn write_i64(self, value: i64) -> [u8; 8] {
92 self.write_u64(value as u64)
93 }
94}