mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2025-03-26 01:35:29 +01:00
44 lines
1.2 KiB
C++
44 lines
1.2 KiB
C++
#pragma once
|
|
|
|
namespace dsp {
|
|
inline uint64_t readBits(int offset, int length, uint8_t* buffer) {
|
|
uint64_t outputValue = 0;
|
|
|
|
int lastBit = offset + (length - 1);
|
|
|
|
int firstWord = offset / 8;
|
|
int lastWord = lastBit / 8;
|
|
int firstOffset = offset - (firstWord * 8);
|
|
int lastOffset = lastBit - (lastWord * 8);
|
|
|
|
int wordCount = (lastWord - firstWord) + 1;
|
|
|
|
// If the data fits in a single byte, just get it
|
|
if (wordCount == 1) {
|
|
return (buffer[firstWord] & (0xFF >> firstOffset)) >> (7 - lastOffset);
|
|
}
|
|
|
|
int bitsRead = length;
|
|
for (int i = 0; i < wordCount; i++) {
|
|
// First word
|
|
if (i == 0) {
|
|
bitsRead -= 8 - firstOffset;
|
|
outputValue |= (uint64_t)(buffer[firstWord] & (0xFF >> firstOffset)) << bitsRead;
|
|
continue;
|
|
}
|
|
|
|
// Last word
|
|
if (i == (wordCount - 1)) {
|
|
outputValue |= (uint64_t)buffer[lastWord] >> (7 - lastOffset);
|
|
break;
|
|
}
|
|
|
|
// Just a normal byte
|
|
bitsRead -= 8;
|
|
outputValue |= (uint64_t)buffer[firstWord + i] << bitsRead;
|
|
}
|
|
|
|
return outputValue;
|
|
}
|
|
}
|