Skip to main content

tiff_core/
byte_order.rs

1/// Byte order indicator from the TIFF header.
2#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3pub enum ByteOrder {
4    LittleEndian,
5    BigEndian,
6}
7
8impl ByteOrder {
9    /// Returns the magic bytes written at offset 0 of the TIFF file.
10    pub fn magic(self) -> [u8; 2] {
11        match self {
12            Self::LittleEndian => *b"II",
13            Self::BigEndian => *b"MM",
14        }
15    }
16
17    /// Read a u16 from a 2-byte array in this byte order.
18    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    /// Read a u32 from a 4-byte array in this byte order.
26    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    /// Read a u64 from an 8-byte array in this byte order.
34    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    /// Read an f64 from an 8-byte array in this byte order.
42    pub fn read_f64(self, bytes: [u8; 8]) -> f64 {
43        f64::from_bits(self.read_u64(bytes))
44    }
45
46    /// Write a u16 in this byte order.
47    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    /// Write a u32 in this byte order.
55    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    /// Write a u64 in this byte order.
63    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    /// Write an f64 in this byte order.
71    pub fn write_f64(self, value: f64) -> [u8; 8] {
72        self.write_u64(value.to_bits())
73    }
74
75    /// Write an f32 in this byte order.
76    pub fn write_f32(self, value: f32) -> [u8; 4] {
77        self.write_u32(value.to_bits())
78    }
79
80    /// Write an i16 in this byte order.
81    pub fn write_i16(self, value: i16) -> [u8; 2] {
82        self.write_u16(value as u16)
83    }
84
85    /// Write an i32 in this byte order.
86    pub fn write_i32(self, value: i32) -> [u8; 4] {
87        self.write_u32(value as u32)
88    }
89
90    /// Write an i64 in this byte order.
91    pub fn write_i64(self, value: i64) -> [u8; 8] {
92        self.write_u64(value as u64)
93    }
94}