dzura/server/src/util/pack.rs
2024-08-11 21:10:05 -07:00

84 lines
1.6 KiB
Rust

pub fn pack_u8(value:u8) -> Vec<u8>
{
vec![value]
}
pub fn unpack_u8(data:&[u8], index:&mut usize) -> u8
{
let mut result = 0u8;
if *index < data.len() {
result = data[*index];
*index += 1;
}
result
}
pub fn pack_u16(value:u16) -> Vec<u8>
{
vec![(value >> 8) as u8, (value & 0xFF) as u8]
}
pub fn unpack_u16(data:&[u8], index:&mut usize) -> u16
{
let mut result = 0u16;
if *index < data.len() {
result = (data[*index] as u16) << 8;
*index += 1;
}
if *index < data.len() {
result |= data[*index] as u16;
*index += 1;
}
result
}
pub fn pack_u32(value:u32) -> Vec<u8>
{
vec![
(value >> 24) as u8,
(value >> 16) as u8,
(value >> 8) as u8,
(value & 0xFF) as u8,
]
}
pub fn unpack_u32(data:&[u8], index:&mut usize) -> u32
{
let mut result = 0u32;
for _ in 0..4 {
result <<= 8;
if *index < data.len() {
result |= data[*index] as u32;
*index += 1;
} else { break; }
}
result
}
pub fn pack_u64(value:u64) -> Vec<u8>
{
vec![
(value >> 56) as u8,
(value >> 48) as u8,
(value >> 40) as u8,
(value >> 32) as u8,
(value >> 24) as u8,
(value >> 16) as u8,
(value >> 8) as u8,
(value & 0xFF) as u8,
]
}
pub fn unpack_u64(data:&[u8], index:&mut usize) -> u64
{
let mut result = 0u64;
for _ in 0..8 {
result <<= 8;
if *index < data.len() {
result |= data[*index] as u64;
*index += 1;
} else { break; }
}
result
}