G
Du könntest Folgendes tun:
Du kodierst deine Daten ganz normal mit Kontrollzeichen, die angeben wann ein Block anfängt, wie lang er ist, welchen Typ deine Daten haben etc..
Danach schickst du deine Daten durch eine Funktion, die folgendes tut (ungetestet):
EDIT:
Hab gar nicht erklärt was ich machen würde... also:
Man entfernt aus allen Bytes das unterste Bit. Diese Bits von 7 Bytes speichert man dann nebeneinander in einem 8. Byte (von oben beginnend, damit das unterste Bit aus ist) und macht die low bits in den ursprünglichen Daten aus. Alle Bytes haben jetzt das unterste Bit nicht gesetzt. Man kann deshalb ab und zu (vor jedem Block, alle x Sekunden, whatever) einmal einen Wert mit gesetztem low bit (z.B. 255) senden, der dir dann als Einstiegspunkt zum parsen eines binären Formats dienen kann. Der Platzverbraucht steigt dadurch (je nach Häufkigkeit der Synchro-Punkte) um 14% - 28% an.
/EDIT
void übertrage_sieben_byte( unsigned char *Input)
{
unsigned char transformed_data[8]; //das wird nachher übertragen
unsigned char &low_bits = transformed_data[7]; //hier kommt von den 7 Bytes jeweils das unterste Bit rein
low_bits = 0; //kein Bit an
for( unsigned int i=0; i<7 ; ++i )
{
unsigned char current_low_bit = Input[i] & 1; //untesters Bit holen
transformed_data[ i ] = Input[i] & 254 ; //alle Bits bleiben wie sie sind, nur das unterste wird ausgemacht
low_bits = low_bits | ( current_low_bit << ( 7 - i ) ) ; //beginnend links wird jeweils das unterste Bit in low_bits geschrieben
}
send( transformed_data );
}
Vor jedem Block machst du dann
void neuer_block()
{
unsigned char magic_number = 255; //alle Bits an, auch das letzte
send( magic_number );
}
Als Empfänger wartest du dann auf 255, danach kannst du dir jeweils 7 Bytes rekonstruieren, indem du die low_bits aus dem 8 Byte unten dranklebst.
Bin verdammt müde, hoffe das ist kein murks.