#include <iostream>
#include <cstdint>
uint32_t getBits(const void *Data, uint32_t DataLen, uint32_t StartBit, uint8_t NumBits)
{
uint32_t Result = 0;
if (DataLen != 0)
{
const uint8_t *pData = &(static_cast<const uint8_t*>(Data)[StartBit / 8]);
uint8_t b = *pData;
int BitOffset = 7 - (StartBit % 8);
for(int i = 0; i < NumBits; ++i)
{
Result <<= 1;
Result |= ((b >> BitOffset) & 0x01);
if (--BitOffset < 0)
{
b = *(++pData);
BitOffset = 7;
}
}
}
return Result;
}
int main() {
uint8_t arr[] = {0x00, 0x00, 0xFF, 0xF1, 0x6D, 0xA2, 0x00, 0x00};
uint32_t value = getBits(arr, 8, 17, 13);
std::cout << value << " (" << std::hex << value << ")";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGludD4KCnVpbnQzMl90IGdldEJpdHMoY29uc3Qgdm9pZCAqRGF0YSwgdWludDMyX3QgRGF0YUxlbiwgdWludDMyX3QgU3RhcnRCaXQsIHVpbnQ4X3QgTnVtQml0cykKewoJdWludDMyX3QgUmVzdWx0ID0gMDsKCWlmIChEYXRhTGVuICE9IDApCgl7CgkJY29uc3QgdWludDhfdCAqcERhdGEgPSAmKHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihEYXRhKVtTdGFydEJpdCAvIDhdKTsKCQl1aW50OF90IGIgPSAqcERhdGE7CgkJaW50IEJpdE9mZnNldCA9IDcgLSAoU3RhcnRCaXQgJSA4KTsKCQlmb3IoaW50IGkgPSAwOyBpIDwgTnVtQml0czsgKytpKQoJCXsKCQkJUmVzdWx0IDw8PSAxOwoJCQlSZXN1bHQgfD0gKChiID4+IEJpdE9mZnNldCkgJiAweDAxKTsKCQkJaWYgKC0tQml0T2Zmc2V0IDwgMCkKCQkJewoJCQkJYiA9ICooKytwRGF0YSk7CgkJCQlCaXRPZmZzZXQgPSA3OwoJCQl9CgkJfQoJfQoJcmV0dXJuIFJlc3VsdDsKfQoKaW50IG1haW4oKSB7Cgl1aW50OF90IGFycltdID0gezB4MDAsIDB4MDAsIDB4RkYsIDB4RjEsIDB4NkQsIDB4QTIsIDB4MDAsIDB4MDB9OwoJdWludDMyX3QgdmFsdWUgPSBnZXRCaXRzKGFyciwgOCwgMTcsIDEzKTsKCXN0ZDo6Y291dCA8PCB2YWx1ZSA8PCAiICgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICIpIjsKCXJldHVybiAwOwp9