mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-06-09 06:18:46 +08:00
Add hg3 export support
This commit is contained in:
227
src/ext/io.rs
227
src/ext/io.rs
@@ -6,9 +6,9 @@ use std::sync::Mutex;
|
||||
|
||||
pub trait Peek {
|
||||
fn peek(&mut self, buf: &mut [u8]) -> Result<usize>;
|
||||
fn peek_extract(&mut self, buf: &mut [u8]) -> Result<()>;
|
||||
fn peek_exact(&mut self, buf: &mut [u8]) -> Result<()>;
|
||||
fn peek_at(&mut self, offset: usize, buf: &mut [u8]) -> Result<usize>;
|
||||
fn peek_extract_at(&mut self, offset: usize, buf: &mut [u8]) -> Result<()>;
|
||||
fn peek_exact_at(&mut self, offset: usize, buf: &mut [u8]) -> Result<()>;
|
||||
fn peek_at_vec(&mut self, offset: usize, len: usize) -> Result<Vec<u8>> {
|
||||
let mut buf = vec![0u8; len];
|
||||
let bytes_read = self.peek_at(offset, &mut buf)?;
|
||||
@@ -17,190 +17,190 @@ pub trait Peek {
|
||||
}
|
||||
Ok(buf)
|
||||
}
|
||||
fn peek_extract_at_vec(&mut self, offset: usize, len: usize) -> Result<Vec<u8>> {
|
||||
fn peek_exact_at_vec(&mut self, offset: usize, len: usize) -> Result<Vec<u8>> {
|
||||
let mut buf = vec![0u8; len];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(buf)
|
||||
}
|
||||
|
||||
fn peek_u8(&mut self) -> Result<u8> {
|
||||
let mut buf = [0u8; 1];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(buf[0])
|
||||
}
|
||||
fn peek_u16(&mut self) -> Result<u16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(u16::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_u16_be(&mut self) -> Result<u16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(u16::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_u32(&mut self) -> Result<u32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(u32::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_u32_be(&mut self) -> Result<u32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(u32::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_u64(&mut self) -> Result<u64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(u64::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_u64_be(&mut self) -> Result<u64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(u64::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_u128(&mut self) -> Result<u128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(u128::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_u128_be(&mut self) -> Result<u128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(u128::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_i8(&mut self) -> Result<i8> {
|
||||
let mut buf = [0u8; 1];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(i8::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i16(&mut self) -> Result<i16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(i16::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i16_be(&mut self) -> Result<i16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(i16::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_i32(&mut self) -> Result<i32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(i32::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i32_be(&mut self) -> Result<i32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(i32::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_i64(&mut self) -> Result<i64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(i64::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i64_be(&mut self) -> Result<i64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(i64::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_i128(&mut self) -> Result<i128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(i128::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i128_be(&mut self) -> Result<i128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.peek_extract(&mut buf)?;
|
||||
self.peek_exact(&mut buf)?;
|
||||
Ok(i128::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_u8_at(&mut self, offset: usize) -> Result<u8> {
|
||||
let mut buf = [0u8; 1];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(buf[0])
|
||||
}
|
||||
fn peek_u16_at(&mut self, offset: usize) -> Result<u16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(u16::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_u16_be_at(&mut self, offset: usize) -> Result<u16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(u16::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_u32_at(&mut self, offset: usize) -> Result<u32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(u32::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_u32_be_at(&mut self, offset: usize) -> Result<u32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(u32::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_u64_at(&mut self, offset: usize) -> Result<u64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(u64::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_u64_be_at(&mut self, offset: usize) -> Result<u64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(u64::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_u128_at(&mut self, offset: usize) -> Result<u128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(u128::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_u128_be_at(&mut self, offset: usize) -> Result<u128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(u128::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_i8_at(&mut self, offset: usize) -> Result<i8> {
|
||||
let mut buf = [0u8; 1];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(i8::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i16_at(&mut self, offset: usize) -> Result<i16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(i16::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i16_be_at(&mut self, offset: usize) -> Result<i16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(i16::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_i32_at(&mut self, offset: usize) -> Result<i32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(i32::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i32_be_at(&mut self, offset: usize) -> Result<i32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(i32::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_i64_at(&mut self, offset: usize) -> Result<i64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(i64::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i64_be_at(&mut self, offset: usize) -> Result<i64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(i64::from_be_bytes(buf))
|
||||
}
|
||||
fn peek_i128_at(&mut self, offset: usize) -> Result<i128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(i128::from_le_bytes(buf))
|
||||
}
|
||||
fn peek_i128_be_at(&mut self, offset: usize) -> Result<i128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.peek_extract_at(offset, &mut buf)?;
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
Ok(i128::from_be_bytes(buf))
|
||||
}
|
||||
|
||||
@@ -220,6 +220,29 @@ pub trait Peek {
|
||||
}
|
||||
Ok(vec)
|
||||
}
|
||||
|
||||
fn peek_and_equal(&mut self, data: &[u8]) -> Result<()> {
|
||||
let mut buf = vec![0u8; data.len()];
|
||||
self.peek_exact(&mut buf)?;
|
||||
if buf != data {
|
||||
return Err(std::io::Error::new(
|
||||
std::io::ErrorKind::InvalidData,
|
||||
"Data does not match",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
fn peek_and_equal_at(&mut self, offset: usize, data: &[u8]) -> Result<()> {
|
||||
let mut buf = vec![0u8; data.len()];
|
||||
self.peek_exact_at(offset, &mut buf)?;
|
||||
if buf != data {
|
||||
return Err(std::io::Error::new(
|
||||
std::io::ErrorKind::InvalidData,
|
||||
"Data does not match at offset",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Read + Seek> Peek for T {
|
||||
@@ -230,7 +253,7 @@ impl<T: Read + Seek> Peek for T {
|
||||
Ok(bytes_read)
|
||||
}
|
||||
|
||||
fn peek_extract(&mut self, buf: &mut [u8]) -> Result<()> {
|
||||
fn peek_exact(&mut self, buf: &mut [u8]) -> Result<()> {
|
||||
let current_pos = self.stream_position()?;
|
||||
self.read_exact(buf)?;
|
||||
self.seek(SeekFrom::Start(current_pos))?;
|
||||
@@ -245,7 +268,7 @@ impl<T: Read + Seek> Peek for T {
|
||||
Ok(bytes_read)
|
||||
}
|
||||
|
||||
fn peek_extract_at(&mut self, offset: usize, buf: &mut [u8]) -> Result<()> {
|
||||
fn peek_exact_at(&mut self, offset: usize, buf: &mut [u8]) -> Result<()> {
|
||||
let current_pos = self.stream_position()?;
|
||||
self.seek(SeekFrom::Start(offset as u64))?;
|
||||
self.read_exact(buf)?;
|
||||
@@ -292,7 +315,7 @@ impl<T: Read + Seek> Peek for T {
|
||||
|
||||
pub trait CPeek {
|
||||
fn cpeek(&self, buf: &mut [u8]) -> Result<usize>;
|
||||
fn cpeek_extract(&self, buf: &mut [u8]) -> Result<()> {
|
||||
fn cpeek_exact(&self, buf: &mut [u8]) -> Result<()> {
|
||||
let bytes_read = self.cpeek(buf)?;
|
||||
if bytes_read < buf.len() {
|
||||
return Err(std::io::Error::new(
|
||||
@@ -303,7 +326,7 @@ pub trait CPeek {
|
||||
Ok(())
|
||||
}
|
||||
fn cpeek_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize>;
|
||||
fn cpeek_extract_at(&self, offset: usize, buf: &mut [u8]) -> Result<()> {
|
||||
fn cpeek_exact_at(&self, offset: usize, buf: &mut [u8]) -> Result<()> {
|
||||
let bytes_read = self.cpeek_at(offset, buf)?;
|
||||
if bytes_read < buf.len() {
|
||||
return Err(std::io::Error::new(
|
||||
@@ -321,190 +344,190 @@ pub trait CPeek {
|
||||
}
|
||||
Ok(buf)
|
||||
}
|
||||
fn cpeek_extract_at_vec(&self, offset: usize, len: usize) -> Result<Vec<u8>> {
|
||||
fn cpeek_exact_at_vec(&self, offset: usize, len: usize) -> Result<Vec<u8>> {
|
||||
let mut buf = vec![0u8; len];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(buf)
|
||||
}
|
||||
|
||||
fn cpeek_u8(&self) -> Result<u8> {
|
||||
let mut buf = [0u8; 1];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(buf[0])
|
||||
}
|
||||
fn cpeek_u16(&self) -> Result<u16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(u16::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_u16_be(&self) -> Result<u16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(u16::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_u32(&self) -> Result<u32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(u32::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_u32_be(&self) -> Result<u32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(u32::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_u64(&self) -> Result<u64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(u64::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_u64_be(&self) -> Result<u64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(u64::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_u128(&self) -> Result<u128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(u128::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_u128_be(&self) -> Result<u128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(u128::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_i8(&self) -> Result<i8> {
|
||||
let mut buf = [0u8; 1];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(i8::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i16(&self) -> Result<i16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(i16::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i16_be(&self) -> Result<i16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(i16::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_i32(&self) -> Result<i32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(i32::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i32_be(&self) -> Result<i32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(i32::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_i64(&self) -> Result<i64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(i64::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i64_be(&self) -> Result<i64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(i64::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_i128(&self) -> Result<i128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(i128::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i128_be(&self) -> Result<i128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.cpeek_extract(&mut buf)?;
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
Ok(i128::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_u8_at(&self, offset: usize) -> Result<u8> {
|
||||
let mut buf = [0u8; 1];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(buf[0])
|
||||
}
|
||||
fn cpeek_u16_at(&self, offset: usize) -> Result<u16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(u16::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_u16_be_at(&self, offset: usize) -> Result<u16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(u16::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_u32_at(&self, offset: usize) -> Result<u32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(u32::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_u32_be_at(&self, offset: usize) -> Result<u32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(u32::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_u64_at(&self, offset: usize) -> Result<u64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(u64::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_u64_be_at(&self, offset: usize) -> Result<u64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(u64::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_u128_at(&self, offset: usize) -> Result<u128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(u128::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_u128_be_at(&self, offset: usize) -> Result<u128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(u128::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_i8_at(&self, offset: usize) -> Result<i8> {
|
||||
let mut buf = [0u8; 1];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(i8::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i16_at(&self, offset: usize) -> Result<i16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(i16::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i16_be_at(&self, offset: usize) -> Result<i16> {
|
||||
let mut buf = [0u8; 2];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(i16::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_i32_at(&self, offset: usize) -> Result<i32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(i32::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i32_be_at(&self, offset: usize) -> Result<i32> {
|
||||
let mut buf = [0u8; 4];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(i32::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_i64_at(&self, offset: usize) -> Result<i64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(i64::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i64_be_at(&self, offset: usize) -> Result<i64> {
|
||||
let mut buf = [0u8; 8];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(i64::from_be_bytes(buf))
|
||||
}
|
||||
fn cpeek_i128_at(&self, offset: usize) -> Result<i128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(i128::from_le_bytes(buf))
|
||||
}
|
||||
fn cpeek_i128_be_at(&self, offset: usize) -> Result<i128> {
|
||||
let mut buf = [0u8; 16];
|
||||
self.cpeek_extract_at(offset, &mut buf)?;
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
Ok(i128::from_be_bytes(buf))
|
||||
}
|
||||
|
||||
@@ -518,6 +541,29 @@ pub trait CPeek {
|
||||
}
|
||||
CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
|
||||
}
|
||||
|
||||
fn cpeek_and_equal(&self, data: &[u8]) -> Result<()> {
|
||||
let mut buf = vec![0u8; data.len()];
|
||||
self.cpeek_exact(&mut buf)?;
|
||||
if buf != data {
|
||||
return Err(std::io::Error::new(
|
||||
std::io::ErrorKind::InvalidData,
|
||||
"Data does not match",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
fn cpeek_and_equal_at(&self, offset: usize, data: &[u8]) -> Result<()> {
|
||||
let mut buf = vec![0u8; data.len()];
|
||||
self.cpeek_exact_at(offset, &mut buf)?;
|
||||
if buf != data {
|
||||
return Err(std::io::Error::new(
|
||||
std::io::ErrorKind::InvalidData,
|
||||
"Data does not match at offset",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Peek> CPeek for Mutex<T> {
|
||||
@@ -560,6 +606,8 @@ pub trait ReadExt {
|
||||
fn read_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String>;
|
||||
|
||||
fn read_exact_vec(&mut self, len: usize) -> Result<Vec<u8>>;
|
||||
|
||||
fn read_and_equal(&mut self, data: &[u8]) -> Result<()>;
|
||||
}
|
||||
|
||||
impl<T: Read> ReadExt for T {
|
||||
@@ -685,6 +733,18 @@ impl<T: Read> ReadExt for T {
|
||||
self.read_exact(&mut buf)?;
|
||||
Ok(buf)
|
||||
}
|
||||
|
||||
fn read_and_equal(&mut self, data: &[u8]) -> Result<()> {
|
||||
let mut buf = vec![0u8; data.len()];
|
||||
self.read_exact(&mut buf)?;
|
||||
if buf != data {
|
||||
return Err(std::io::Error::new(
|
||||
std::io::ErrorKind::InvalidData,
|
||||
"Data does not match",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub trait WriteExt {
|
||||
@@ -1047,6 +1107,9 @@ impl<'a> CPeek for MemReaderRef<'a> {
|
||||
|
||||
fn cpeek_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize> {
|
||||
let len = self.data.len();
|
||||
if offset >= len {
|
||||
return Ok(0);
|
||||
}
|
||||
let bytes_to_read = std::cmp::min(buf.len(), len - offset);
|
||||
buf[..bytes_to_read].copy_from_slice(&self.data[offset..offset + bytes_to_read]);
|
||||
Ok(bytes_to_read)
|
||||
|
||||
Reference in New Issue
Block a user