mcproto_rs/
byte_order.rs

1use crate::{DeserializeResult, Deserialized, DeserializeErr};
2use crate::utils::take;
3use core::convert::TryInto;
4
5pub type ProtoByteOrder = BigEndian;
6
7pub trait ByteOrder {
8    fn write_u2long(v: u128) -> [u8; 16];
9
10    fn write_2long(v: i128) -> [u8; 16] {
11        Self::write_u2long(v as u128)
12    }
13
14    fn read_u2long(data: &[u8]) -> DeserializeResult<u128>;
15
16    fn read_2long(data: &[u8]) -> DeserializeResult<i128> {
17        Ok(Self::read_u2long(data)?.map(move |data| data as i128))
18    }
19
20    fn write_ulong(v: u64) -> [u8; 8];
21
22    fn write_long(v: i64) -> [u8; 8] {
23        Self::write_ulong(v as u64)
24    }
25
26    fn read_ulong(data: &[u8]) -> DeserializeResult<u64>;
27
28    fn read_long(data: &[u8]) -> DeserializeResult<i64> {
29        Ok(Self::read_ulong(data)?.map(move |data| data as i64))
30    }
31
32    fn write_uint(v: u32) -> [u8; 4];
33
34    fn write_int(v: i32) -> [u8; 4] {
35        Self::write_uint(v as u32)
36    }
37
38    fn read_uint(data: &[u8]) -> DeserializeResult<u32>;
39
40    fn read_int(data: &[u8]) -> DeserializeResult<i32> {
41        Ok(Self::read_uint(data)?.map(move |data| data as i32))
42    }
43
44    fn write_ushort(v: u16) -> [u8; 2];
45
46    fn write_short(v: i16) -> [u8; 2] {
47        Self::write_ushort(v as u16)
48    }
49
50    fn read_ushort(data: &[u8]) -> DeserializeResult<u16>;
51
52    fn read_short(data: &[u8]) -> DeserializeResult<i16> {
53        Ok(Self::read_ushort(data)?.map(move |data| data as i16))
54    }
55
56    fn write_ubyte(v: u8) -> [u8; 1] {
57        [v]
58    }
59
60    fn read_ubyte(data: &[u8]) -> DeserializeResult<u8> {
61        match data.split_first() {
62            Some((byte, rest)) => Deserialized::ok(*byte, rest),
63            None => Err(DeserializeErr::Eof)
64        }
65    }
66
67    fn write_byte(v: i8) -> [u8; 1] {
68        [v as u8]
69    }
70
71    fn read_byte(data: &[u8]) -> DeserializeResult<i8> {
72        Ok(Self::read_ubyte(data)?.map(move |b| b as i8))
73    }
74
75    fn write_float(v: f32) -> [u8; 4];
76
77    fn read_float(data: &[u8]) -> DeserializeResult<f32>;
78
79    fn write_double(v: f64) -> [u8; 8];
80
81    fn read_double(data: &[u8]) -> DeserializeResult<f64>;
82}
83
84pub struct BigEndian;
85
86impl ByteOrder for BigEndian {
87    fn write_u2long(v: u128) -> [u8; 16] {
88        [
89            ((v >> 120) as u8),
90            ((v >> 112) as u8),
91            ((v >> 104) as u8),
92            ((v >> 96) as u8),
93            ((v >> 88) as u8),
94            ((v >> 80) as u8),
95            ((v >> 72) as u8),
96            ((v >> 64) as u8),
97            ((v >> 56) as u8),
98            ((v >> 48) as u8),
99            ((v >> 40) as u8),
100            ((v >> 32) as u8),
101            ((v >> 24) as u8),
102            ((v >> 16) as u8),
103            ((v >> 8) as u8),
104            (v as u8),
105        ]
106    }
107
108    fn read_u2long(data: &[u8]) -> DeserializeResult<'_, u128> {
109        Ok(take(16, data)?.map(move |bytes| {
110            ((bytes[0] as u128) << 120) |
111                ((bytes[1] as u128) << 112) |
112                ((bytes[2] as u128) << 104) |
113                ((bytes[3] as u128) << 96) |
114                ((bytes[4] as u128) << 88) |
115                ((bytes[5] as u128) << 80) |
116                ((bytes[6] as u128) << 72) |
117                ((bytes[7] as u128) << 64) |
118                ((bytes[8] as u128) << 56) |
119                ((bytes[9] as u128) << 48) |
120                ((bytes[10] as u128) << 40) |
121                ((bytes[11] as u128) << 32) |
122                ((bytes[12] as u128) << 24) |
123                ((bytes[13] as u128) << 16) |
124                ((bytes[14] as u128) << 8) |
125                (bytes[15] as u128)
126        }))
127    }
128
129    fn write_ulong(v: u64) -> [u8; 8] {
130        [
131            ((v >> 56) as u8),
132            ((v >> 48) as u8),
133            ((v >> 40) as u8),
134            ((v >> 32) as u8),
135            ((v >> 24) as u8),
136            ((v >> 16) as u8),
137            ((v >> 8) as u8),
138            (v as u8),
139        ]
140    }
141
142    fn read_ulong(data: &[u8]) -> DeserializeResult<'_, u64> {
143        Ok(take(8, data)?.map(move |bytes| {
144            ((bytes[0] as u64) << 56) |
145                ((bytes[1] as u64) << 48) |
146                ((bytes[2] as u64) << 40) |
147                ((bytes[3] as u64) << 32) |
148                ((bytes[4] as u64) << 24) |
149                ((bytes[5] as u64) << 16) |
150                ((bytes[6] as u64) << 8) |
151                (bytes[7] as u64)
152        }))
153    }
154
155    fn write_uint(v: u32) -> [u8; 4] {
156        [
157            ((v >> 24) as u8),
158            ((v >> 16) as u8),
159            ((v >> 8) as u8),
160            (v as u8),
161        ]
162    }
163
164    fn read_uint(data: &[u8]) -> DeserializeResult<'_, u32> {
165        Ok(take(4, data)?.map(move |bytes| {
166            ((bytes[0] as u32) << 24) |
167                ((bytes[1] as u32) << 16) |
168                ((bytes[2] as u32) << 8) |
169                (bytes[3] as u32)
170        }))
171    }
172
173    fn write_ushort(v: u16) -> [u8; 2] {
174        [
175            ((v >> 8) as u8),
176            (v as u8),
177        ]
178    }
179
180    fn read_ushort(data: &[u8]) -> DeserializeResult<'_, u16> {
181        Ok(take(2, data)?
182            .map(move |bytes| ((bytes[0] as u16) << 8) | (bytes[1] as u16)))
183    }
184
185    fn write_float(v: f32) -> [u8; 4] {
186        v.to_be_bytes()
187    }
188
189    fn read_float(data: &[u8]) -> DeserializeResult<'_, f32> {
190        Ok(take(4, data)?.map(move |bytes| {
191            f32::from_be_bytes(bytes.try_into().expect("is exactly 4 long"))
192        }))
193
194    }
195
196    fn write_double(v: f64) -> [u8; 8] {
197        v.to_be_bytes()
198    }
199
200    fn read_double(data: &[u8]) -> DeserializeResult<'_, f64> {
201        Ok(take(8, data)?.map(move |bytes| {
202            f64::from_be_bytes(bytes.try_into().expect("is exactly 8 long"))
203        }))
204    }
205}
206
207pub struct LittleEndian;
208
209impl ByteOrder for LittleEndian {
210    fn write_u2long(v: u128) -> [u8; 16] {
211        [
212            v as u8,
213            (v >> 8) as u8,
214            (v >> 16) as u8,
215            (v >> 24) as u8,
216            (v >> 32) as u8,
217            (v >> 40) as u8,
218            (v >> 48) as u8,
219            (v >> 56) as u8,
220            (v >> 64) as u8,
221            (v >> 72) as u8,
222            (v >> 80) as u8,
223            (v >> 88) as u8,
224            (v >> 96) as u8,
225            (v >> 104) as u8,
226            (v >> 112) as u8,
227            (v >> 120) as u8,
228        ]
229    }
230
231    fn read_u2long(data: &[u8]) -> DeserializeResult<'_, u128> {
232        Ok(take(16, data)?.map(move |bytes| {
233            (bytes[0] as u128) |
234                ((bytes[1] as u128) << 8) |
235                ((bytes[2] as u128) << 16) |
236                ((bytes[3] as u128) << 24) |
237                ((bytes[4] as u128) << 32) |
238                ((bytes[5] as u128) << 40) |
239                ((bytes[6] as u128) << 48) |
240                ((bytes[7] as u128) << 56) |
241                ((bytes[8] as u128) << 64) |
242                ((bytes[9] as u128) << 72) |
243                ((bytes[10] as u128) << 80) |
244                ((bytes[11] as u128) << 88) |
245                ((bytes[12] as u128) << 96) |
246                ((bytes[13] as u128) << 104) |
247                ((bytes[14] as u128) << 112) |
248                ((bytes[15] as u128) << 120)
249        }))
250    }
251
252    fn write_ulong(v: u64) -> [u8; 8] {
253        [
254            v as u8,
255            (v >> 8) as u8,
256            (v >> 16) as u8,
257            (v >> 24) as u8,
258            (v >> 32) as u8,
259            (v >> 40) as u8,
260            (v >> 48) as u8,
261            (v >> 56) as u8
262        ]
263    }
264
265    fn read_ulong(data: &[u8]) -> DeserializeResult<'_, u64> {
266        Ok(take(8, data)?.map(move |bytes| {
267            (bytes[0] as u64) |
268                ((bytes[1] as u64) << 8) |
269                ((bytes[2] as u64) << 16) |
270                ((bytes[3] as u64) << 24) |
271                ((bytes[4] as u64) << 32) |
272                ((bytes[5] as u64) << 40) |
273                ((bytes[6] as u64) << 48) |
274                ((bytes[7] as u64) << 56)
275        }))
276    }
277
278    fn write_uint(v: u32) -> [u8; 4] {
279        [
280            v as u8,
281            (v >> 8) as u8,
282            (v >> 16) as u8,
283            (v >> 24) as u8,
284        ]
285    }
286
287    fn read_uint(data: &[u8]) -> DeserializeResult<'_, u32> {
288        Ok(take(4, data)?.map(move |bytes| {
289            (bytes[0] as u32) |
290                ((bytes[1] as u32) << 8) |
291                ((bytes[2] as u32) << 16) |
292                ((bytes[3] as u32) << 24)
293        }))
294    }
295
296    fn write_ushort(v: u16) -> [u8; 2] {
297        [
298            v as u8,
299            (v >> 8) as u8,
300        ]
301    }
302
303    fn read_ushort(data: &[u8]) -> DeserializeResult<'_, u16> {
304        Ok(take(4, data)?
305            .map(move |bytes| (bytes[0] as u16) | ((bytes[1] as u16) << 8)))
306    }
307
308    fn write_float(v: f32) -> [u8; 4] {
309        v.to_le_bytes()
310    }
311
312    fn read_float(data: &[u8]) -> DeserializeResult<'_, f32> {
313        Ok(take(4, data)?.map(move |bytes| {
314            f32::from_le_bytes(bytes.try_into().expect("is exactly 4 long"))
315        }))
316    }
317
318    fn write_double(v: f64) -> [u8; 8] {
319        v.to_le_bytes()
320    }
321
322    fn read_double(data: &[u8]) -> DeserializeResult<'_, f64> {
323        Ok(take(8, data)?.map(move |bytes| {
324            f64::from_le_bytes(bytes.try_into().expect("is exactly 8 long"))
325        }))
326    }
327}