Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.98 KB | None | 0 0
  1. use std::convert::TryInto;
  2.  
  3. #[inline(never)] #[no_mangle]
  4. fn grab_bit_slice(buffer: &[u8], offset: usize) -> u64 {
  5. let offset_bytes = offset / 8;
  6. let offset_bits = offset - offset_bytes * 8;
  7. let offset_tail = offset_bytes + 8;
  8. let len = buffer.len();
  9.  
  10. // special case if the buffer is too small.
  11. let bytes_available = len - offset_bytes;
  12. if bytes_available < 9 {
  13. let mut mini_buffer = [0u8; 9];
  14. (&mut mini_buffer[0..bytes_available]).copy_from_slice(&buffer[offset_bytes..len]);
  15. return grab_bit_slice(&mini_buffer, offset_bits)
  16. }
  17.  
  18. let read_body =
  19. u64::from_be_bytes((&buffer[offset_bytes..offset_tail]).try_into().unwrap());
  20.  
  21. let read_tail = buffer[offset_tail] as u64;
  22.  
  23. (read_body << offset_bits) | (read_tail >> (8 - offset_bits))
  24. }
  25.  
  26. fn main() {
  27. let bytes = b"my hands, they are typing words";
  28. println!("{:p}", bytes);
  29. for i in 0..100 {
  30. println!("{:064b}", grab_bit_slice(bytes, i))
  31. }
  32. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement