Dies mag eine etwas theoretische Frage sein. Ich habe ein Char-Array mit Bytes, die Netzwerkpakete enthalten. Ich möchte alle 66 Bits prüfen, ob ein bestimmtes Bitpaar ('01' oder '10') vorkommt. Das heißt, sobald ich das erste Bit-Paar gefunden habe, muss ich 66 Bits überspringen und das Vorhandensein desselben Bit-Paares erneut überprüfen. Ich versuche, ein Programm mit Masken und Verschiebungen zu implementieren, und es wird ziemlich kompliziert. Ich möchte wissen, ob jemand einen besseren Weg vorschlagen kann, um das Gleiche zu tun.
Der Code, den ich bisher geschrieben habe, sieht ungefähr so aus. Er ist allerdings nicht vollständig.
test_sync_bits(char *rec, int len)
{
uint8_t target_byte = 0;
int offset = 0;
int save_offset = 0;
uint8_t *pload = (uint8_t*)(rec + 24);
uint8_t seed_mask = 0xc0;
uint8_t seed_shift = 6;
uint8_t value = 0;
uint8_t found_sync = 0;
const uint8_t sync_bit_spacing = 66;
/*hunt for the first '10' or '01' combination.*/
target_byte = *(uint8_t*)(pload + offset);
/*Get all combinations of two bits from target byte.*/
while(seed_shift)
{
value = ((target_byte & seed_mask) >> seed_shift);
if((value == 0x01) || (value == 0x10))
{
save_offset = offset;
found_sync = 1;
break;
}
else
{
seed_mask = (seed_mask >> 2) ;
seed_shift-=2;
}
}
offset = offset + 8;
seed_shift = (seed_shift - 4) > 0 ? (seed_shift - 4) : (seed_shift + 8 - 4);
seed_mask = (seed_mask >> (6 - seed_shift));
}
Eine andere Idee, die ich hatte, war die Verwendung einer Struktur, die wie folgt definiert ist
typedef struct
{
int remainder_bits;
int extra_bits;
int extra_byte;
}remainder_bits_extra_bits_map_t;
static remainder_bits_extra_bits_map_t sync_bit_check [] =
{
{6, 4, 0},
{5, 5, 0},
{4, 6, 0},
{3, 7, 0},
{2, 8, 0},
{1, 1, 1},
{0, 2, 1},
};
Ist mein Ansatz richtig? Kann jemand Verbesserungsvorschläge für dasselbe machen?