csharp_binary_encoding/encoding/
binarywriter.rs1
2use std::io;
3use std::io::Write;
4pub struct BinaryWriter<T: Write> {
11 output: T
12}
13
14impl<T> BinaryWriter<T>
15where T: Write {
16
17 pub fn new(output: T) -> Self {
19 Self {
20 output
21 }
22 }
23
24 pub fn write_byte(&mut self, data: u8) -> io::Result<usize> {
26 self.output.write(&[data])
27 }
28
29 pub fn write_bytes(&mut self, data: &[u8]) -> io::Result<usize> {
31 self.output.write(data)
32 }
33
34 pub fn write_7_bit_encoded_int(&mut self, data: i32) -> io::Result<usize> {
38 let mut value = data as u32;
39 let mut out_bytes: Vec<u8> = Vec::new();
40 while value > 0x7F {
41 let low_bits_and_flag: u8 = (value | !0x7F).to_le_bytes()[0];
42 value >>= 7;
43 out_bytes.push(low_bits_and_flag);
44 }
45 out_bytes.push(value.to_le_bytes()[0]);
46 self.write_bytes(&out_bytes)
47 }
48
49 pub fn write_7_bit_encoded_int64(&mut self, data: i64) -> io::Result<usize> {
53 let mut value = data as u64;
54 let mut out_bytes: Vec<u8> = Vec::new();
55 while value > 0x7F {
56 let low_bits_and_flag: u8 = (value | !0x7F).to_le_bytes()[0];
57 value >>= 7;
58 out_bytes.push(low_bits_and_flag);
59 }
60 out_bytes.push(value.to_le_bytes()[0]);
61 self.write_bytes(&out_bytes)
62 }
63
64 pub fn write_boolean(&mut self, data: bool) -> io::Result<usize> {
66 if data {
70 self.write_byte(1)
71 } else {
72 self.write_byte(0)
73 }
74 }
75
76 pub fn write_f32(&mut self, data: f32) -> io::Result<usize> {
78 self.output.write(&data.to_le_bytes())
79 }
80
81 pub fn write_f64(&mut self, data: f64) -> io::Result<usize> {
83 self.output.write(&data.to_le_bytes())
84 }
85
86 #[cfg_attr(docsrs, doc(cfg(feature = "f16")))]
88 #[cfg(feature = "f16")]
89 pub fn write_f16(&mut self, data: f16) -> io::Result<usize> {
90 self.output.write(&data.to_le_bytes())
91 }
92
93 pub fn write_string(&mut self, data: &str) -> io::Result<usize> {
95 if let Err(e) = self.write_7_bit_encoded_int(data.len().try_into().unwrap()) {
97 return Err(e)
98 }
99 self.write_bytes(data.as_bytes())
102 }
103
104 pub fn write_i8(&mut self, data: i8) -> io::Result<usize> {
106 self.output.write(&data.to_le_bytes())
107 }
108
109 pub fn write_i16(&mut self, data: i16) -> io::Result<usize> {
111 self.output.write(&data.to_le_bytes())
112 }
113
114 pub fn write_i32(&mut self, data: i32) -> io::Result<usize> {
116 self.output.write(&data.to_le_bytes())
117 }
118
119 pub fn write_i64(&mut self, data: i64) -> io::Result<usize> {
121 self.output.write(&data.to_le_bytes())
122 }
123
124 pub fn write_u16(&mut self, data: u16) -> io::Result<usize> {
126 self.output.write(&data.to_le_bytes())
127 }
128
129 pub fn write_u32(&mut self, data: u32) -> io::Result<usize> {
131 self.output.write(&data.to_le_bytes())
132 }
133
134 pub fn write_u64(&mut self, data: u64) -> io::Result<usize> {
136 self.output.write(&data.to_le_bytes())
137 }
138
139 pub fn write_char(&mut self, data: char) -> io::Result<usize> {
141 let mut buf: [u8; 4] = [0; 4];
142 self.write_bytes(data.encode_utf8(buf.as_mut_slice()).as_bytes())
143 }
144
145}