1 use super::*; 2 use crate::error::*; 3 4 // pack_bytes appends the wire format of field to msg. 5 pub(crate) fn pack_bytes(mut msg: Vec<u8>, field: &[u8]) -> Vec<u8> { 6 msg.extend_from_slice(field); 7 msg 8 } 9 10 pub(crate) fn unpack_bytes(msg: &[u8], off: usize, field: &mut [u8]) -> Result<usize> { 11 let new_off = off + field.len(); 12 if new_off > msg.len() { 13 return Err(Error::ErrBaseLen); 14 } 15 field.copy_from_slice(&msg[off..new_off]); 16 Ok(new_off) 17 } 18 19 // pack_uint16 appends the wire format of field to msg. 20 pub(crate) fn pack_uint16(mut msg: Vec<u8>, field: u16) -> Vec<u8> { 21 msg.extend_from_slice(&field.to_be_bytes()); 22 msg 23 } 24 25 pub(crate) fn unpack_uint16(msg: &[u8], off: usize) -> Result<(u16, usize)> { 26 if off + UINT16LEN > msg.len() { 27 return Err(Error::ErrBaseLen); 28 } 29 30 Ok(( 31 (msg[off] as u16) << 8 | (msg[off + 1] as u16), 32 off + UINT16LEN, 33 )) 34 } 35 36 pub(crate) fn skip_uint16(msg: &[u8], off: usize) -> Result<usize> { 37 if off + UINT16LEN > msg.len() { 38 return Err(Error::ErrBaseLen); 39 } 40 Ok(off + UINT16LEN) 41 } 42 43 // pack_uint32 appends the wire format of field to msg. 44 pub(crate) fn pack_uint32(mut msg: Vec<u8>, field: u32) -> Vec<u8> { 45 msg.extend_from_slice(&field.to_be_bytes()); 46 msg 47 } 48 49 pub(crate) fn unpack_uint32(msg: &[u8], off: usize) -> Result<(u32, usize)> { 50 if off + UINT32LEN > msg.len() { 51 return Err(Error::ErrBaseLen); 52 } 53 let v = (msg[off] as u32) << 24 54 | (msg[off + 1] as u32) << 16 55 | (msg[off + 2] as u32) << 8 56 | (msg[off + 3] as u32); 57 Ok((v, off + UINT32LEN)) 58 } 59 60 pub(crate) fn skip_uint32(msg: &[u8], off: usize) -> Result<usize> { 61 if off + UINT32LEN > msg.len() { 62 return Err(Error::ErrBaseLen); 63 } 64 Ok(off + UINT32LEN) 65 } 66 67 // pack_text appends the wire format of field to msg. 68 pub(crate) fn pack_str(mut msg: Vec<u8>, field: &str) -> Result<Vec<u8>> { 69 let l = field.len(); 70 if l > 255 { 71 return Err(Error::ErrStringTooLong); 72 } 73 msg.push(l as u8); 74 msg.extend_from_slice(field.as_bytes()); 75 Ok(msg) 76 } 77 78 pub(crate) fn unpack_str(msg: &[u8], off: usize) -> Result<(String, usize)> { 79 if off >= msg.len() { 80 return Err(Error::ErrBaseLen); 81 } 82 let begin_off = off + 1; 83 let end_off = begin_off + msg[off] as usize; 84 if end_off > msg.len() { 85 return Err(Error::ErrCalcLen); 86 } 87 88 Ok(( 89 String::from_utf8(msg[begin_off..end_off].to_vec())?, 90 end_off, 91 )) 92 } 93