1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use core::ops::Shl;

pub trait ConvertToU16 {
    fn to_u16_big_endian(self) -> [u16; 4];
    fn to_u16_little_endian(self) -> [u16; 4];
}

impl ConvertToU16 for [u8; 8] {
    fn to_u16_big_endian(self) -> [u16; 4] {
        [
            ((self[0] as u16) << 8) | self[1] as u16,
            ((self[2] as u16) << 8) | self[3] as u16,
            ((self[4] as u16) << 8) | self[5] as u16,
            ((self[6] as u16) << 8) | self[7] as u16,
        ]
    }

    fn to_u16_little_endian(self) -> [u16; 4] {
        [
            ((self[1] as u16) << 8) | self[0] as u16,
            ((self[3] as u16) << 8) | self[2] as u16,
            ((self[5] as u16) << 8) | self[4] as u16,
            ((self[7] as u16) << 8) | self[6] as u16,
        ]
    }
}

pub trait ConvertToU8 {
    fn to_u8_big_endian(self) -> [u8; 8];
    fn to_u8_little_endian(self) -> [u8; 8];
}

impl ConvertToU8 for [u16; 4] {
    fn to_u8_big_endian(self) -> [u8; 8] {
        [
            (self[0] >> 8) as u8,
            self[0] as u8,
            (self[1] >> 8) as u8,
            self[1] as u8,
            (self[2] >> 8) as u8,
            self[2] as u8,
            (self[3] >> 8) as u8,
            self[3] as u8,
        ]
    }

    fn to_u8_little_endian(self) -> [u8; 8] {
        [
            self[0] as u8,
            (self[0] >> 8) as u8,
            self[1] as u8,
            (self[1] >> 8) as u8,
            self[2] as u8,
            (self[2] >> 8) as u8,
            self[3] as u8,
            (self[3] >> 8) as u8,
        ]
    }
}

pub fn make_u16(upper: u8, lower: u8) -> u16 {
    lower as u16 | (upper as u16).shl(8)
}

pub fn make_i16(upper: u8, lower: u8) -> i16 {
    make_u16(upper, lower) as i16
}