Ho un vector<char>
e voglio essere in grado di ottenere un numero intero senza segno da un intervallo di bit all'interno del vettore. Per esempio.Get Integer From Bits Inside `std :: vector <char>`
E io non riesco a essere in grado di scrivere le operazioni giuste per ottenere il risultato desiderato. Mio algoritmo inteso così:
&
il primo byte con(0xff >> unused bits in byte on the left)
<<
il risultato ha lasciato il numero di byte di uscita * numero di bit in un byte|
questo con l'output finale- Per ogni byte successivo:
<<
lasciato dalla (larghezza byte - indice) * bit per byte|
questo byte con l'output finale
|
il byte finale (non spostato) con l'uscita finale>>
l'output finale per il numero di bit non utilizzati nel byte a destra
E qui è il mio tentativo di codifica di esso, che non dà il risultato corretto:
#include <vector>
#include <iostream>
#include <cstdint>
#include <bitset>
template<class byte_type = char>
class BitValues {
private:
std::vector<byte_type> bytes;
public:
static const auto bits_per_byte = 8;
BitValues(std::vector<byte_type> bytes) : bytes(bytes) {
}
template<class return_type>
return_type get_bits(int start, int end) {
auto byte_start = (start - (start % bits_per_byte))/bits_per_byte;
auto byte_end = (end - (end % bits_per_byte))/bits_per_byte;
auto byte_width = byte_end - byte_start;
return_type value = 0;
unsigned char first = bytes[byte_start];
first &= (0xff >> start % 8);
return_type first_wide = first;
first_wide <<= byte_width;
value |= first_wide;
for(auto byte_i = byte_start + 1; byte_i <= byte_end; byte_i++) {
auto byte_offset = (byte_width - byte_i) * bits_per_byte;
unsigned char next_thin = bytes[byte_i];
return_type next_byte = next_thin;
next_byte <<= byte_offset;
value |= next_byte;
}
value >>= (((byte_end + 1) * bits_per_byte) - end) % bits_per_byte;
return value;
}
};
int main() {
BitValues<char> bits(std::vector<char>({'\x78', '\xDA', '\x05', '\x5F', '\x8A', '\xF1', '\x0F', '\xA0'}));
std::cout << bits.get_bits<unsigned>(15, 29) << "\n";
return 0;
}
(in azione: http://coliru.stacked-crooked.com/a/261d32875fcf2dc0)
Non riesco proprio a comprendere le piccole manipolazioni e trovo il debug molto difficile! Se qualcuno può correggere il codice sopra, o aiutarmi in qualsiasi modo, sarebbe molto apprezzato!
Edit:
- mie byte sono 8 bit lunghe
- Il numero intero di ritorno potrebbe essere 8,16,32 o 64 bit wside
- Il numero intero è memorizzato in big endian
Questo funziona alla grande per interi senza segno, grazie! Sono solo al momento a indagare sugli interi firmati - non sono * del tutto * sicuro di quello che il mio output desiderato per 'get_bits (14, 22)' è al minuto! Ci tornerò presto con un aggiornamento su questo, o se trovo che questo è il comportamento desiderato, un segno di spunta per voi :) –
Ell
Sembra che questo codice non funzioni per 'bits.get_bits (0, 32) ; '- restituisce zero invece del previsto' 519053860746' –
Ell
Hai ragione. Il bug è dovuto al modo in cui il risultato è mascherato alla fine. Lo spostamento a sinistra sposta il bit fuori dal significato causando una maschera di bit di 0. Ho aggiunto una correzione. – Cookyt