1
0
Fork 0
mirror of https://codeberg.org/icewind/bitbuffer.git synced 2026-06-03 08:34:07 +02:00

fix signed reading

This commit is contained in:
Robin Appelman 2019-08-26 20:17:59 +02:00
commit c3709e57d8
2 changed files with 17 additions and 10 deletions

View file

@ -242,15 +242,9 @@ where
where
T: PrimInt + BitOrAssign + IsSigned + UncheckedPrimitiveInt,
{
let type_bit_size = size_of::<T>() * 8;
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)
}
}
/// Panics:
///

View file

@ -124,7 +124,7 @@ fn read_i8_le() {
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, 8).unwrap(), -0b011_0101);
assert_eq!(buffer.read_int::<i8>(0, 8).unwrap(), -0b100_1011);
}
#[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>(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]
@ -304,7 +304,7 @@ fn read_trait() {
let b: i8 = stream.read().unwrap();
assert_eq!(0b110_1010, b);
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();
assert_eq!(true, d);
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!(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);
}