use crate::ReadSeek; use byteorder::ReadBytesExt; use std::char::decode_utf16; use std::fmt::Write; use std::io; pub fn to_hex_string(bytes: &[u8]) -> String { let len = bytes.len(); // Each byte is represented by 2 ascii bytes. let mut s = String::with_capacity(len * 2); for byte in bytes { write!(s, "{:02X}", byte).expect("Writing to an allocated string cannot fail"); } s } /// Reads a utf16 string from the given stream. /// If `len` is given, exactly `len` u16 values are read from the stream. /// If `len` is None, the string is assumed to be null terminated and the stream will be read to the first null (0). pub fn read_utf16_string(stream: &mut T, len: Option) -> io::Result { let mut buffer = match len { Some(len) => Vec::with_capacity(len), None => Vec::new(), }; match len { Some(len) => { for _ in 0..len { let next_char = stream.read_u16::()?; buffer.push(next_char); } } None => loop { let next_char = stream.read_u16::()?; if next_char == 0 { break; } buffer.push(next_char); }, } // We need to stop if we see a NUL byte, even if asked for more bytes. decode_utf16(buffer.into_iter().take_while(|&byte| byte != 0x00)) .map(|r| r.map_err(|_e| io::Error::from(io::ErrorKind::InvalidData))) .collect() }