tachyon/tachyon/
int_buffer.rs1pub struct IntBuffer {
2 pub index: usize,
3}
4
5impl IntBuffer {
6 pub fn write_u32(&mut self, v: u32, data: &mut [u8]) {
7 data[self.index] = v as u8;
8 self.index += 1;
9 data[self.index] = (v >> 8) as u8;
10 self.index += 1;
11 data[self.index] = (v >> 16) as u8;
12 self.index += 1;
13 data[self.index] = (v >> 24) as u8;
14 self.index += 1;
15 }
16
17 pub fn read_u32(&mut self, data: &[u8]) -> u32 {
18 let value = (data[self.index] as u32)
19 | (data[self.index + 1] as u32) << 8
20 | (data[self.index + 2] as u32) << 16
21 | (data[self.index + 3] as u32) << 24;
22 self.index += 4;
23 return value;
24 }
25
26 pub fn write_u16(&mut self, v: u16, data: &mut [u8]) {
27 data[self.index] = v as u8;
28 self.index += 1;
29 data[self.index] = (v >> 8) as u8;
30 self.index += 1;
31 }
32
33 pub fn read_u16(&mut self, data: &[u8]) -> u16 {
34 let value = (data[self.index] as u16) | (data[self.index + 1] as u16) << 8;
35 self.index += 2;
36 return value;
37 }
38
39 pub fn write_u8(&mut self, v: u8, data: &mut [u8]) {
40 data[self.index] = v;
41 self.index += 1;
42 }
43
44 pub fn read_u8(&mut self, data: &[u8]) -> u8 {
45 let value = data[self.index];
46 self.index += 1;
47 return value;
48 }
49
50 pub fn u4_to_u8(v1: u8, v2: u8) -> u8 {
51 return v1 | v2 << 4;
52 }
53
54 pub fn u8_to_u4(byte: u8) -> (u8,u8) {
55 return (byte & 0x0F, byte >> 4);
56 }
57}
58
59#[cfg(test)]
60mod tests {
61 use crate::tachyon::int_buffer::IntBuffer;
62
63 #[test]
64 fn test_4bit() {
65 let mut low = 3;
66 let mut high = 15;
67 let byte = IntBuffer::u4_to_u8(low, high);
68 let res = IntBuffer::u8_to_u4(byte);
69 low = res.0;
70 high = res.1;
71
72 println!("{0}", byte);
73 println!("{0} {1}", low, high);
74 }
75
76 #[test]
77 fn test_header_readwrite() {
78 let mut bytes: Vec<u8> = vec![0; 128];
79
80 let mut buffer = IntBuffer { index: 0 };
81 buffer.write_u32(234, &mut bytes);
82 buffer.write_u16(44, &mut bytes);
83 buffer.write_u8(99, &mut bytes);
84 buffer.write_u32(1, &mut bytes);
85 buffer.index = 0;
86 assert_eq!(234, buffer.read_u32(&bytes));
87 assert_eq!(44, buffer.read_u16(&bytes));
88 assert_eq!(99, buffer.read_u8(&bytes));
89 assert_eq!(1, buffer.read_u32(&bytes));
90 return;
91 }
92}