mirror of
https://git.eta.st/eta/rsp6-decoder.git
synced 2025-12-30 13:06:24 +00:00
53 lines
1.3 KiB
Rust
53 lines
1.3 KiB
Rust
pub fn slice_bool(a: &[u8], index: usize) -> bool {
|
|
(a[index / 8] >> (7 - (index % 8))) == 1
|
|
}
|
|
|
|
pub fn slice_int(a: &[u8], start_bit: usize, length_bits: usize) -> u32 {
|
|
let i = start_bit as u32;
|
|
let i2 = length_bits as u32;
|
|
let mut i3: u32 = (i as u32) & 7;
|
|
let mut i4: u32 = i3;
|
|
let mut i5: u32 = (i as u32) >> 3;
|
|
let mut i6: u32 = (1 << (8 - i3)) - 1;
|
|
let mut i7: u32 = 0;
|
|
let mut i8: u32 = 0;
|
|
while (i2 - i7) > 0 {
|
|
i8 |= (i6 & a[i5 as usize] as u32) << ((i4 + 24) - i7);
|
|
i7 += 8 - i4;
|
|
i6 = 255;
|
|
i4 = 0;
|
|
i5 += 1;
|
|
}
|
|
|
|
i8 >> (32 - i2)
|
|
}
|
|
|
|
pub fn slice_base64(a: &[u8], start_bit: usize, chars: usize) -> String {
|
|
let mut sb = String::new();
|
|
let mut i = start_bit as u32;
|
|
let mut i2 = chars as u32;
|
|
let mut i3: u32 = i & 7;
|
|
let mut i4: u32 = i3;
|
|
let mut i5: u32 = i >> 3;
|
|
let mut i6: u32 = (1 << (8 - i3)) - 1;
|
|
let mut i7: u32 = 0;
|
|
let mut i8: u32 = 0;
|
|
|
|
while i2 > 0 {
|
|
if i7 >= 6 {
|
|
sb.push(((i8 >> 26) + 32) as u8 as char);
|
|
i8 <<= 6;
|
|
i7 -= 6;
|
|
i2 -= 1;
|
|
} else {
|
|
i8 |= (i6 & a[i5 as usize] as u32) << ((i4 + 24) - i7);
|
|
i7 += 8 - i4;
|
|
i6 = 255;
|
|
i4 = 0;
|
|
i5 += 1
|
|
}
|
|
}
|
|
|
|
sb
|
|
}
|