protocol_serialization/
protocol_serialization.rs1use tiny_varint::{
8 encode_zigzag,
9 VarIntEncoder, VarIntDecoder, Error, varint_size
10};
11
12#[derive(Debug, PartialEq)]
14struct SimpleMessage {
15 message_id: u64,
17
18 temperature: i16,
20
21 humidity: i8,
23
24 payload: [u8; 16],
26}
27
28impl SimpleMessage {
29 fn serialized_size(&self) -> usize {
31 let id_size = varint_size(self.message_id);
33
34 let mut temp_buf = [0u8; 10];
36 let temp_size = encode_zigzag(self.temperature, &mut temp_buf).unwrap();
37
38 let mut hum_buf = [0u8; 10];
39 let humidity_size = encode_zigzag(self.humidity, &mut hum_buf).unwrap();
40
41 let payload_len_size = varint_size(self.payload.len() as u64);
43
44 id_size + temp_size + humidity_size + payload_len_size + self.payload.len()
45 }
46
47 fn serialize(&self, buffer: &mut [u8]) -> Result<usize, Error> {
49 let mut encoder = VarIntEncoder::<u32>::new(buffer);
51
52 encoder.write(self.message_id as u32)?;
54
55 encoder.write_zigzag(self.temperature)?;
57
58 encoder.write_zigzag(self.humidity)?;
60
61 encoder.write(self.payload.len() as u32)?;
63
64 let current_offset = encoder.position();
66 if current_offset + self.payload.len() > buffer.len() {
67 return Err(Error::BufferTooSmall {
68 needed: current_offset + self.payload.len(),
69 actual: buffer.len(),
70 });
71 }
72
73 buffer[current_offset..current_offset + self.payload.len()]
74 .copy_from_slice(&self.payload);
75
76 Ok(current_offset + self.payload.len())
77 }
78
79 fn deserialize(bytes: &[u8]) -> Result<(Self, usize), Error> {
81 let mut decoder = VarIntDecoder::<u32>::new(bytes);
82
83 let message_id = decoder.read()? as u64;
85
86 let temperature = decoder.read_zigzag::<i16>()?;
88
89 let humidity = decoder.read_zigzag::<i8>()?;
91
92 let payload_len = decoder.read()? as usize;
94 if payload_len != 16 {
95 return Err(Error::InvalidEncoding);
96 }
97
98 let current_offset = decoder.position();
100 if current_offset + payload_len > bytes.len() {
101 return Err(Error::InputTooShort);
102 }
103
104 let mut payload = [0u8; 16];
105 payload.copy_from_slice(&bytes[current_offset..current_offset + payload_len]);
106
107 let final_offset = current_offset + payload_len;
108
109 let msg = SimpleMessage {
110 message_id,
111 temperature,
112 humidity,
113 payload,
114 };
115
116 Ok((msg, final_offset))
117 }
118}
119
120fn main() {
121 println!("=== Protocol Serialization Example ===\n");
122
123 let mut payload = [0u8; 16];
125 for i in 0..payload.len() {
126 payload[i] = (i * 10) as u8;
127 }
128
129 let original_msg = SimpleMessage {
130 message_id: 42,
131 temperature: -15,
132 humidity: 85,
133 payload,
134 };
135
136 println!("Original message: {:#?}", original_msg);
137
138 let expected_size = original_msg.serialized_size();
140 println!("Expected serialized size: {} bytes", expected_size);
141
142 let mut buffer = [0u8; 100];
144 let serialize_result = original_msg.serialize(&mut buffer);
145
146 match serialize_result {
147 Ok(size) => {
148 println!("Serialization successful, used {} bytes", size);
149
150 print!("Serialized bytes: [ ");
151 for i in 0..size {
152 print!("{:#04x} ", buffer[i]);
153 }
154 println!("]");
155
156 match SimpleMessage::deserialize(&buffer[0..size]) {
158 Ok((decoded_msg, decoded_size)) => {
159 println!("\nDecoded message: {:#?}", decoded_msg);
160 println!("Decoded byte size: {} bytes", decoded_size);
161
162 println!("\nOriginal message and decoded message match: {}",
163 original_msg == decoded_msg);
164 }
165 Err(e) => {
166 println!("Decoding failed: {:?}", e);
167 }
168 }
169
170 println!("\nSpace efficiency analysis:");
172 let fixed_size = 8 + 2 + 1 + 16; println!(" Using fixed-size encoding: {} bytes", fixed_size);
174 println!(" Using varint encoding: {} bytes", size);
175 println!(" Savings: {} bytes ({:.1}%)",
176 fixed_size - size,
177 ((fixed_size - size) as f32 / fixed_size as f32) * 100.0);
178 }
179 Err(e) => {
180 println!("Serialization failed: {:?}", e);
181 }
182 }
183
184 println!("\n=== Example Complete ===");
185}