1use core::ops::Shl;
2
3pub trait ConvertToU16 {
4 fn to_u16_big_endian(self) -> [u16; 4];
5 fn to_u16_little_endian(self) -> [u16; 4];
6}
7
8impl ConvertToU16 for [u8; 8] {
9 fn to_u16_big_endian(self) -> [u16; 4] {
10 [
11 ((self[0] as u16) << 8) | self[1] as u16,
12 ((self[2] as u16) << 8) | self[3] as u16,
13 ((self[4] as u16) << 8) | self[5] as u16,
14 ((self[6] as u16) << 8) | self[7] as u16,
15 ]
16 }
17
18 fn to_u16_little_endian(self) -> [u16; 4] {
19 [
20 ((self[1] as u16) << 8) | self[0] as u16,
21 ((self[3] as u16) << 8) | self[2] as u16,
22 ((self[5] as u16) << 8) | self[4] as u16,
23 ((self[7] as u16) << 8) | self[6] as u16,
24 ]
25 }
26}
27
28pub trait ConvertToU8 {
29 fn to_u8_big_endian(self) -> [u8; 8];
30 fn to_u8_little_endian(self) -> [u8; 8];
31}
32
33impl ConvertToU8 for [u16; 4] {
34 fn to_u8_big_endian(self) -> [u8; 8] {
35 [
36 (self[0] >> 8) as u8,
37 self[0] as u8,
38 (self[1] >> 8) as u8,
39 self[1] as u8,
40 (self[2] >> 8) as u8,
41 self[2] as u8,
42 (self[3] >> 8) as u8,
43 self[3] as u8,
44 ]
45 }
46
47 fn to_u8_little_endian(self) -> [u8; 8] {
48 [
49 self[0] as u8,
50 (self[0] >> 8) as u8,
51 self[1] as u8,
52 (self[1] >> 8) as u8,
53 self[2] as u8,
54 (self[2] >> 8) as u8,
55 self[3] as u8,
56 (self[3] >> 8) as u8,
57 ]
58 }
59}
60
61pub fn make_u16(upper: u8, lower: u8) -> u16 {
62 lower as u16 | (upper as u16).shl(8)
63}
64
65pub fn make_u32(top: u8, high: u8, low: u8, bottom: u8) -> u32 {
66 bottom as u32 | (low as u32).shl(8) | (high as u32).shl(16) | (top as u32).shl(24)
67}
68
69pub fn make_i16(upper: u8, lower: u8) -> i16 {
70 make_u16(upper, lower) as i16
71}