mirror of
https://codeberg.org/icewind/bitbuffer.git
synced 2026-06-03 16:44:06 +02:00
fix read_bytes and read_bool
This commit is contained in:
parent
6d999f7471
commit
ed19848d2a
2 changed files with 12 additions and 8 deletions
19
src/lib.rs
19
src/lib.rs
|
|
@ -131,7 +131,8 @@ impl<'a, E> BitBuffer<'a, E> where E: Endianness {
|
||||||
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
|
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
|
||||||
/// ];
|
/// ];
|
||||||
/// let buffer: BitBuffer<LittleEndian> = BitBuffer::new(bytes);
|
/// let buffer: BitBuffer<LittleEndian> = BitBuffer::new(bytes);
|
||||||
/// let result = buffer.read_bool(6);
|
/// let result = buffer.read_bool(5).unwrap();
|
||||||
|
/// assert_eq!(result, true);
|
||||||
/// ```
|
/// ```
|
||||||
pub fn read_bool(&self, position: usize) -> Result<bool> {
|
pub fn read_bool(&self, position: usize) -> Result<bool> {
|
||||||
let byte_index = position / 8;
|
let byte_index = position / 8;
|
||||||
|
|
@ -146,8 +147,7 @@ impl<'a, E> BitBuffer<'a, E> where E: Endianness {
|
||||||
|
|
||||||
let byte = self.bytes[byte_index];
|
let byte = self.bytes[byte_index];
|
||||||
let shifted = byte >> bit_offset;
|
let shifted = byte >> bit_offset;
|
||||||
let mask = 1u8 << bit_offset;
|
Ok(shifted & 1u8 == 1)
|
||||||
Ok(shifted & mask == 1)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Read a sequence of bits from the buffer as integer
|
/// Read a sequence of bits from the buffer as integer
|
||||||
|
|
@ -167,7 +167,8 @@ impl<'a, E> BitBuffer<'a, E> where E: Endianness {
|
||||||
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
|
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
|
||||||
/// ];
|
/// ];
|
||||||
/// let buffer: BitBuffer<LittleEndian> = BitBuffer::new(bytes);
|
/// let buffer: BitBuffer<LittleEndian> = BitBuffer::new(bytes);
|
||||||
/// let result = buffer.read::<u16>(10, 9);
|
/// let result = buffer.read::<u16>(10, 9).unwrap();
|
||||||
|
/// assert_eq!(result, 0b100_0110_10);
|
||||||
/// ```
|
/// ```
|
||||||
pub fn read<T>(&self, position: usize, count: usize) -> Result<T>
|
pub fn read<T>(&self, position: usize, count: usize) -> Result<T>
|
||||||
where T: PrimInt + BitOrAssign + IsSigned
|
where T: PrimInt + BitOrAssign + IsSigned
|
||||||
|
|
@ -183,7 +184,8 @@ impl<'a, E> BitBuffer<'a, E> where E: Endianness {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if size_of::<usize>() > size_of::<T>() || count < usize_bit_size - 8 {
|
let bit_offset = position & 7;
|
||||||
|
if size_of::<usize>() > size_of::<T>() || count + bit_offset < usize_bit_size {
|
||||||
let raw = self.read_usize(position, count)?;
|
let raw = self.read_usize(position, count)?;
|
||||||
let max_signed_value = (1 << (type_bit_size - 1)) - 1;
|
let max_signed_value = (1 << (type_bit_size - 1)) - 1;
|
||||||
if T::is_signed() && raw > max_signed_value {
|
if T::is_signed() && raw > max_signed_value {
|
||||||
|
|
@ -242,7 +244,8 @@ impl<'a, E> BitBuffer<'a, E> where E: Endianness {
|
||||||
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
|
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
|
||||||
/// ];
|
/// ];
|
||||||
/// let buffer: BitBuffer<LittleEndian> = BitBuffer::new(bytes);
|
/// let buffer: BitBuffer<LittleEndian> = BitBuffer::new(bytes);
|
||||||
/// let bytes = buffer.read_bytes(5, 3);
|
/// let bytes = buffer.read_bytes(5, 3).unwrap();
|
||||||
|
/// assert_eq!(bytes, &[0b0_1010_101, 0b0_1100_011, 0b1_1001_101]);
|
||||||
/// ```
|
/// ```
|
||||||
pub fn read_bytes(&self, position: usize, byte_count: usize) -> Result<Vec<u8>> {
|
pub fn read_bytes(&self, position: usize, byte_count: usize) -> Result<Vec<u8>> {
|
||||||
let mut data = vec!();
|
let mut data = vec!();
|
||||||
|
|
@ -253,7 +256,7 @@ impl<'a, E> BitBuffer<'a, E> where E: Endianness {
|
||||||
while byte_left > 0 {
|
while byte_left > 0 {
|
||||||
let read = min(byte_left, max_read);
|
let read = min(byte_left, max_read);
|
||||||
let bytes: [u8; USIZE_SIZE] = self.read_usize(read_pos, read * 8)?.to_le_bytes();
|
let bytes: [u8; USIZE_SIZE] = self.read_usize(read_pos, read * 8)?.to_le_bytes();
|
||||||
let usable_bytes = &bytes[0..max_read];
|
let usable_bytes = &bytes[0..read];
|
||||||
data.extend_from_slice(usable_bytes);
|
data.extend_from_slice(usable_bytes);
|
||||||
byte_left -= read;
|
byte_left -= read;
|
||||||
read_pos += read;
|
read_pos += read;
|
||||||
|
|
@ -278,7 +281,7 @@ impl<'a, E> BitBuffer<'a, E> where E: Endianness {
|
||||||
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
|
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
|
||||||
/// ];
|
/// ];
|
||||||
/// let buffer: BitBuffer<LittleEndian> = BitBuffer::new(bytes);
|
/// let buffer: BitBuffer<LittleEndian> = BitBuffer::new(bytes);
|
||||||
/// let result = buffer.read_float::<f32>(10);
|
/// let result = buffer.read_float::<f32>(10).unwrap();
|
||||||
/// ```
|
/// ```
|
||||||
pub fn read_float<T>(&self, position: usize) -> Result<T>
|
pub fn read_float<T>(&self, position: usize) -> Result<T>
|
||||||
where T: Float
|
where T: Float
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,7 @@ fn read_u64_le() {
|
||||||
assert_eq!(buffer.read::<u64>(6, 34).unwrap(), 0b1001_1001_1001_1001_1010_1100_0110_1010_10);
|
assert_eq!(buffer.read::<u64>(6, 34).unwrap(), 0b1001_1001_1001_1001_1010_1100_0110_1010_10);
|
||||||
assert_eq!(buffer.read::<u64>(6, 60).unwrap(), 0b01_1110_0111_1001_1001_1001_1001_1001_1001_1001_1001_1010_1100_0110_1010_10);
|
assert_eq!(buffer.read::<u64>(6, 60).unwrap(), 0b01_1110_0111_1001_1001_1001_1001_1001_1001_1001_1001_1010_1100_0110_1010_10);
|
||||||
assert_eq!(buffer.read::<u64>(6, 64).unwrap(), 0b01_1001_1110_0111_1001_1001_1001_1001_1001_1001_1001_1001_1010_1100_0110_1010_10);
|
assert_eq!(buffer.read::<u64>(6, 64).unwrap(), 0b01_1001_1110_0111_1001_1001_1001_1001_1001_1001_1001_1001_1010_1100_0110_1010_10);
|
||||||
|
assert_eq!(buffer.read::<u64>(8, 62).unwrap(), 0b01_1001_1110_0111_1001_1001_1001_1001_1001_1001_1001_1001_1010_1100_0110_1010);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue