Похоже, я попал в маленькую / большую ловушку с обратным порядком байтов.
В основном, как сказал Ален, в комментариях - все правильно, и это просто представления.
Я придумал следующий метод, который может извлекать биты из порядкового номера с прямым порядком байтов, который должен быть в формате с прямым порядком байтов:
/**
* @bex
*/
uint8_t bexd(uint16_t n, uint8_t o, uint8_t l, uint8_t d) {
uint8_t v = 0;
uint8_t ob = d - o;
for (uint8_t b=ob; b > (ob-l); b--) v = ( v << 1 ) | ( 0x0001 & ( n >> (b-1) ) );
return v;
}
uint8_t bexw(uint16_t n, uint8_t o, uint8_t l) {return bexd(n, o, l, 16);}
uint8_t bexb(uint8_t n, uint8_t o, uint8_t l) {return bexd(n, o, l, 8);}
Например:
В старшем порядке байтов «второе» значение сохраняется в битах 3,4 и 5 по сравнению с младшим порядковым номером, где оно будет храниться в битах 10, 11 и 12. Вышеописанный метод позволяет работать в «младшем порядке» "value, как будто это будет значение с" прямым порядком байтов ".
Чтобы извлечь второе значение из этого значения 0011000000111000
, просто выполните:
byte v = bex(7180, 3, 3); // 111
Serial.println(v); // prints 255
Надеюсь, это кому-нибудь поможет.