1pub fn encode_byte(data: u8) -> Vec<u8> {
2 vec![data]
3}
4
5pub fn decode_byte(data: &[u8]) -> u8 {
6 assert_eq!(data.len(), 1);
7 data[0]
8}
9
10pub fn encode_byte32(data: [u8; 32]) -> Vec<u8> {
11 data.to_vec()
12}
13
14pub fn decode_byte32(data: &[u8]) -> [u8; 32] {
15 assert_eq!(data.len(), 32);
16 let mut r = [0u8; 32];
17 r.copy_from_slice(data);
18 r
19}
20
21pub fn encode_bytes(data: &[u8]) -> Vec<u8> {
22 let mut r = vec![];
23 r.extend(&(data.len() as u32).to_le_bytes());
24 r.extend(data);
25 r
26}
27
28pub fn decode_bytes(data: &[u8]) -> Vec<u8> {
29 assert!(data.len() >= 4);
30 let l = u32::from_le_bytes(data[0..4].try_into().unwrap());
31 assert_eq!(l as usize, data.len() - 4);
32 data[4..].to_vec()
33}
34
35pub fn encode_u32(data: u32) -> Vec<u8> {
36 data.to_le_bytes().to_vec()
37}
38
39pub fn decode_u32(data: &[u8]) -> u32 {
40 assert_eq!(data.len(), 4);
41 u32::from_le_bytes(data.try_into().unwrap())
42}
43
44pub fn encode_u64(data: u64) -> Vec<u8> {
45 data.to_le_bytes().to_vec()
46}
47
48pub fn decode_u64(data: &[u8]) -> u64 {
49 assert_eq!(data.len(), 8);
50 u64::from_le_bytes(data.try_into().unwrap())
51}
52
53pub fn encode_u128(data: u128) -> Vec<u8> {
54 data.to_le_bytes().to_vec()
55}
56
57pub fn decode_u128(data: &[u8]) -> u128 {
58 assert_eq!(data.len(), 16);
59 u128::from_le_bytes(data.try_into().unwrap())
60}
61
62pub fn encode_dynvec(data: Vec<Vec<u8>>) -> Vec<u8> {
63 let mut head: Vec<u8> = vec![];
64 let mut body: Vec<u8> = vec![];
65 let head_size = 4 + 4 * data.len();
66 let mut body_size = 0;
67 for item in data {
68 let size = head_size + body_size;
69 let size = size as u32;
70 head.extend(&size.to_le_bytes());
71 body.extend(&item);
72 body_size += item.len();
73 }
74 let size = head_size + body_size;
75 let size = size as u32;
76 [size.to_le_bytes().to_vec(), head, body].concat()
77}
78
79pub fn decode_dynvec(data: &[u8]) -> Vec<Vec<u8>> {
80 assert!(data.len() >= 4);
81 assert!(data.len() as u32 == u32::from_le_bytes(data[0..4].try_into().unwrap()));
82 if data.len() == 4 {
83 return Vec::new();
84 }
85 let nums = (u32::from_le_bytes(data[4..8].try_into().unwrap()) / 4 - 1) as usize;
86 let mut head: Vec<usize> = vec![];
87 for i in 0..nums {
88 head.push(u32::from_le_bytes(data[i * 4 + 4..i * 4 + 8].try_into().unwrap()) as usize);
89 }
90 head.push(data.len());
91 let mut body: Vec<Vec<u8>> = Vec::new();
92 for i in 0..nums {
93 body.push(data[head[i]..head[i + 1]].to_vec());
94 }
95 body
96}
97
98pub fn encode_fixvec(data: Vec<Vec<u8>>) -> Vec<u8> {
99 let mut r = vec![];
100 r.extend(&(data.len() as u32).to_le_bytes());
101 for e in data {
102 r.extend(&e);
103 }
104 r
105}
106
107pub fn decode_fixvec(data: &[u8]) -> Vec<Vec<u8>> {
108 assert!(data.len() >= 4);
109 let icnt = u32::from_le_bytes(data[0..4].try_into().unwrap()) as usize;
110 let mut body: Vec<Vec<u8>> = vec![];
111 if icnt > 0 {
112 let size = data[4..].len() / icnt;
113 for i in 0..icnt {
114 body.push(data[4 + i * size..4 + i * size + size].to_vec());
115 }
116 }
117 body
118}
119
120pub fn encode_seq(data: Vec<Vec<u8>>) -> Vec<u8> {
121 let mut r: Vec<u8> = vec![];
122 for e in data {
123 r.extend(&e)
124 }
125 r
126}
127
128pub fn decode_seq(data: &[u8], size: &[usize]) -> Vec<Vec<u8>> {
129 let mut r: Vec<Vec<u8>> = vec![];
130 let mut s = 0;
131 for n in size {
132 r.push(data[s..s + n].to_vec());
133 s += n;
134 }
135 r
136}