#![allow(dead_code)]
pub fn decode_utf8(b: &[u8]) -> String {
String::from_utf8_lossy(b).into_owned()
}
#[derive(Default)]
pub struct ByteWriter {
buf: Vec<u8>,
}
impl ByteWriter {
pub fn new() -> Self {
Self { buf: Vec::new() }
}
pub fn with_capacity(cap: usize) -> Self {
Self {
buf: Vec::with_capacity(cap),
}
}
pub fn len(&self) -> usize {
self.buf.len()
}
pub fn is_empty(&self) -> bool {
self.buf.is_empty()
}
pub fn u8(&mut self, v: u8) -> &mut Self {
self.buf.push(v);
self
}
pub fn u16(&mut self, v: u16) -> &mut Self {
self.buf.extend_from_slice(&v.to_be_bytes());
self
}
pub fn u24(&mut self, v: u32) -> &mut Self {
let b = v.to_be_bytes();
self.buf.extend_from_slice(&b[1..4]);
self
}
pub fn u32(&mut self, v: u32) -> &mut Self {
self.buf.extend_from_slice(&v.to_be_bytes());
self
}
pub fn bytes(&mut self, b: &[u8]) -> &mut Self {
self.buf.extend_from_slice(b);
self
}
pub fn as_slice(&self) -> &[u8] {
&self.buf
}
pub fn into_vec(self) -> Vec<u8> {
self.buf
}
}
pub struct ByteReader<'a> {
buf: &'a [u8],
pub cursor: usize,
}
impl<'a> ByteReader<'a> {
pub fn new(buf: &'a [u8]) -> Self {
Self { buf, cursor: 0 }
}
pub fn remaining(&self) -> usize {
self.buf.len() - self.cursor
}
pub fn u8(&mut self) -> u8 {
let v = self.buf[self.cursor];
self.cursor += 1;
v
}
pub fn u16(&mut self) -> u16 {
let v = u16::from_be_bytes([self.buf[self.cursor], self.buf[self.cursor + 1]]);
self.cursor += 2;
v
}
pub fn u24(&mut self) -> u32 {
let a = self.buf[self.cursor] as u32;
let b = self.buf[self.cursor + 1] as u32;
let c = self.buf[self.cursor + 2] as u32;
self.cursor += 3;
(a << 16) | (b << 8) | c
}
pub fn u32(&mut self) -> u32 {
let v = u32::from_be_bytes([
self.buf[self.cursor],
self.buf[self.cursor + 1],
self.buf[self.cursor + 2],
self.buf[self.cursor + 3],
]);
self.cursor += 4;
v
}
pub fn bytes(&mut self, n: usize) -> Option<&'a [u8]> {
if self.remaining() < n {
return None;
}
let out = &self.buf[self.cursor..self.cursor + n];
self.cursor += n;
Some(out)
}
pub fn peek(&self) -> u8 {
self.buf[self.cursor]
}
}