mirror of
https://codeberg.org/icewind/bitbuffer.git
synced 2026-06-03 16:44:06 +02:00
fix signed reading
This commit is contained in:
parent
a3aa275a87
commit
c3709e57d8
2 changed files with 17 additions and 10 deletions
|
|
@ -242,15 +242,9 @@ where
|
||||||
where
|
where
|
||||||
T: PrimInt + BitOrAssign + IsSigned + UncheckedPrimitiveInt,
|
T: PrimInt + BitOrAssign + IsSigned + UncheckedPrimitiveInt,
|
||||||
{
|
{
|
||||||
let type_bit_size = size_of::<T>() * 8;
|
|
||||||
let raw = self.read_usize(position, count);
|
let raw = self.read_usize(position, count);
|
||||||
let max_signed_value = (1 << (type_bit_size - 1)) - 1;
|
|
||||||
if T::is_signed() && raw > max_signed_value {
|
|
||||||
T::zero() - T::from_unchecked(raw & max_signed_value)
|
|
||||||
} else {
|
|
||||||
T::from_unchecked(raw)
|
T::from_unchecked(raw)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/// Panics:
|
/// Panics:
|
||||||
///
|
///
|
||||||
|
|
|
||||||
|
|
@ -124,7 +124,7 @@ fn read_i8_le() {
|
||||||
let buffer = BitBuffer::new(BYTES.to_vec(), LittleEndian);
|
let buffer = BitBuffer::new(BYTES.to_vec(), LittleEndian);
|
||||||
|
|
||||||
assert_eq!(buffer.read_int::<i8>(0, 3).unwrap(), -0b01);
|
assert_eq!(buffer.read_int::<i8>(0, 3).unwrap(), -0b01);
|
||||||
assert_eq!(buffer.read_int::<i8>(0, 8).unwrap(), -0b011_0101);
|
assert_eq!(buffer.read_int::<i8>(0, 8).unwrap(), -0b100_1011);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -133,7 +133,7 @@ fn read_i8_be() {
|
||||||
|
|
||||||
assert_eq!(buffer.read_int::<i8>(1, 2).unwrap(), 0b1);
|
assert_eq!(buffer.read_int::<i8>(1, 2).unwrap(), 0b1);
|
||||||
assert_eq!(buffer.read_int::<i8>(0, 3).unwrap(), -0b01);
|
assert_eq!(buffer.read_int::<i8>(0, 3).unwrap(), -0b01);
|
||||||
assert_eq!(buffer.read_int::<i8>(0, 8).unwrap(), -0b011_0101);
|
assert_eq!(buffer.read_int::<i8>(0, 8).unwrap(), -0b100_1011);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -304,7 +304,7 @@ fn read_trait() {
|
||||||
let b: i8 = stream.read().unwrap();
|
let b: i8 = stream.read().unwrap();
|
||||||
assert_eq!(0b110_1010, b);
|
assert_eq!(0b110_1010, b);
|
||||||
let c: i16 = stream.read().unwrap();
|
let c: i16 = stream.read().unwrap();
|
||||||
assert_eq!(-0b0010_1100_1001_1001, c);
|
assert_eq!(-0b101_0011_0110_0111, c);
|
||||||
let d: bool = stream.read().unwrap();
|
let d: bool = stream.read().unwrap();
|
||||||
assert_eq!(true, d);
|
assert_eq!(true, d);
|
||||||
let e: Option<u8> = stream.read().unwrap();
|
let e: Option<u8> = stream.read().unwrap();
|
||||||
|
|
@ -407,3 +407,16 @@ fn test_read_nonzero() {
|
||||||
assert_eq!(NonZeroU16::new(12), stream.read().unwrap());
|
assert_eq!(NonZeroU16::new(12), stream.read().unwrap());
|
||||||
assert_eq!(None, stream.read::<Option<NonZeroU16>>().unwrap());
|
assert_eq!(None, stream.read::<Option<NonZeroU16>>().unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn read_read_signed() {
|
||||||
|
let buffer = BitBuffer::new(vec![255, 255, 255, 255, 255, 255, 255, 255], LittleEndian);
|
||||||
|
|
||||||
|
assert_eq!(buffer.read_int::<i32>(0, 32).unwrap(), -1);
|
||||||
|
|
||||||
|
let bytes = (-10i32).to_le_bytes();
|
||||||
|
let mut byte_vec = Vec::with_capacity(4);
|
||||||
|
byte_vec.extend_from_slice(&bytes);
|
||||||
|
let buffer = BitBuffer::new(byte_vec, LittleEndian);
|
||||||
|
assert_eq!(buffer.read_int::<i32>(0, 32).unwrap(), -10);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue