mirror of
https://github.com/tribufu/rust-gamedig
synced 2026-06-01 09:42:41 +00:00
More tests and fixed (?) utf16 be string reading
This commit is contained in:
parent
3f58e99c28
commit
645582868d
1 changed files with 32 additions and 4 deletions
36
src/utils.rs
36
src/utils.rs
|
|
@ -97,10 +97,14 @@ pub mod buffer {
|
||||||
|
|
||||||
pub fn get_string_utf8_le(buf: &[u8], pos: &mut usize) -> GDResult<String> {
|
pub fn get_string_utf8_le(buf: &[u8], pos: &mut usize) -> GDResult<String> {
|
||||||
let sub_buf = &buf[*pos..];
|
let sub_buf = &buf[*pos..];
|
||||||
|
if sub_buf.len() == 0 {
|
||||||
|
return Err(GDError::PacketUnderflow("Unexpectedly short packet for getting an utf8 LE string.".to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
let first_null_position = sub_buf.iter().position(|&x| x == 0)
|
let first_null_position = sub_buf.iter().position(|&x| x == 0)
|
||||||
.ok_or(GDError::PacketBad("Unexpectedly formatted packet for getting a string.".to_string()))?;
|
.ok_or(GDError::PacketBad("Unexpectedly formatted packet for getting a utf8 LE string.".to_string()))?;
|
||||||
let value = std::str::from_utf8(&sub_buf[..first_null_position])
|
let value = std::str::from_utf8(&sub_buf[..first_null_position])
|
||||||
.map_err(|_| GDError::PacketBad("Badly formatted string.".to_string()))?.to_string();
|
.map_err(|_| GDError::PacketBad("Badly formatted utf8 LE string.".to_string()))?.to_string();
|
||||||
|
|
||||||
*pos += value.len() + 1;
|
*pos += value.len() + 1;
|
||||||
Ok(value)
|
Ok(value)
|
||||||
|
|
@ -108,13 +112,17 @@ pub mod buffer {
|
||||||
|
|
||||||
pub fn get_string_utf16_be(buf: &[u8], pos: &mut usize) -> GDResult<String> {
|
pub fn get_string_utf16_be(buf: &[u8], pos: &mut usize) -> GDResult<String> {
|
||||||
let sub_buf = &buf[*pos..];
|
let sub_buf = &buf[*pos..];
|
||||||
|
if sub_buf.len() == 0 {
|
||||||
|
return Err(GDError::PacketUnderflow("Unexpectedly short packet for getting an utf16 BE string.".to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
let paired_buf: Vec<u16> = sub_buf.chunks_exact(2)
|
let paired_buf: Vec<u16> = sub_buf.chunks_exact(2)
|
||||||
.into_iter().map(|a| u16::from_be_bytes([a[0], a[1]])).collect();
|
.into_iter().map(|a| u16::from_be_bytes([a[0], a[1]])).collect();
|
||||||
|
|
||||||
let value = String::from_utf16(&paired_buf)
|
let value = String::from_utf16(&paired_buf)
|
||||||
.map_err(|_| GDError::PacketBad("Badly formatted string.".to_string()))?.to_string();
|
.map_err(|_| GDError::PacketBad("Badly formatted utf16 BE string.".to_string()))?.to_string();
|
||||||
|
|
||||||
*pos += value.len() + 1;
|
*pos += value.len() * 2;
|
||||||
Ok(value)
|
Ok(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -149,6 +157,16 @@ mod tests {
|
||||||
assert_eq!(pos, 2);
|
assert_eq!(pos, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_u16_be_test() {
|
||||||
|
let data = [29, 72];
|
||||||
|
let mut pos = 0;
|
||||||
|
assert_eq!(buffer::get_u16_be(&data, &mut pos).unwrap(), 7496);
|
||||||
|
assert_eq!(pos, 2);
|
||||||
|
assert!(buffer::get_u16_be(&data, &mut pos).is_err());
|
||||||
|
assert_eq!(pos, 2);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn get_u32_le_test() {
|
fn get_u32_le_test() {
|
||||||
let data = [72, 29, 128, 100];
|
let data = [72, 29, 128, 100];
|
||||||
|
|
@ -188,4 +206,14 @@ mod tests {
|
||||||
assert!(buffer::get_string_utf8_le(&data, &mut pos).is_err());
|
assert!(buffer::get_string_utf8_le(&data, &mut pos).is_err());
|
||||||
assert_eq!(pos, 6);
|
assert_eq!(pos, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_string_utf16_be_test() {
|
||||||
|
let data = [0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f];
|
||||||
|
let mut pos = 0;
|
||||||
|
assert_eq!(buffer::get_string_utf16_be(&data, &mut pos).unwrap(), "Hello");
|
||||||
|
assert_eq!(pos, 10);
|
||||||
|
assert!(buffer::get_string_utf16_be(&data, &mut pos).is_err());
|
||||||
|
assert_eq!(pos, 10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue