Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::convert::TryInto;
- #[inline(never)] #[no_mangle]
- fn grab_bit_slice(buffer: &[u8], offset: usize) -> u64 {
- let offset_bytes = offset / 8;
- let offset_bits = offset - offset_bytes * 8;
- let offset_tail = offset_bytes + 8;
- let len = buffer.len();
- // special case if the buffer is too small.
- let bytes_available = len - offset_bytes;
- if bytes_available < 9 {
- let mut mini_buffer = [0u8; 9];
- (&mut mini_buffer[0..bytes_available]).copy_from_slice(&buffer[offset_bytes..len]);
- return grab_bit_slice(&mini_buffer, offset_bits)
- }
- let read_body =
- u64::from_be_bytes((&buffer[offset_bytes..offset_tail]).try_into().unwrap());
- let read_tail = buffer[offset_tail] as u64;
- (read_body << offset_bits) | (read_tail >> (8 - offset_bits))
- }
- fn main() {
- let bytes = b"my hands, they are typing words";
- println!("{:p}", bytes);
- for i in 0..100 {
- println!("{:064b}", grab_bit_slice(bytes, i))
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement