Вам придется иметь дело с ними кратными 8 битам и свободно использовать маскировку (& оператор) и сдвиг (>> оператор).Итак, в качестве примера можно привести поток битов MP3 (из http://www.mp3 -tech.org / programmer / frame_header.html ):
AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
, который может храниться в одном из 32-битная переменная или четыре 8-битные переменные как:
MMLKJJII HGFFEEEE DCCBBAAA AAAAAAAA
Здесь вы должны иметь:
int i = 0;
while (!syncFound)
{
uint16 sync = data[i] | ((data[i + 1] & 0x07) << 8);
if (sync == 0x07ff)
{
// The first 11 bits represent a sync.
uint8 version = (data[i + 1] & 0x18) >> 3;
uint6 layer = (data[i + 1] & 0x60) >> 5);
// etc...
syncFound = TRUE;
} else {
// current byte is not the start of a frame. check if the next byte is.
i++;
}
}
Проверка границ массива может быть утомительной и поэтомутоже может иметь дело с заголовками переменной длины.