Ohne die Daten und ihre genaue Verteilung gesehen zu haben, kann ich nicht mit Sicherheit sagen, was die beste Methode ist, aber ich würde vorschlagen, dass Sie jede Gruppe von 1-4 Datensätzen mit einem Byte beginnen, dessen 8 Bits Folgendes anzeigen:
0-1 Anzahl der Bytes der ID, die aus dem vorherigen Datensatz übernommen werden sollen 2-4 Format des Positionssatzes 6-7 Anzahl der aufeinanderfolgenden Datensätze, die das gleiche "Modus"-Byte verwenden
Jeder Positionsdatensatz kann auf eine von acht Arten gespeichert werden; alle anderen Typen außer 000 verwenden vorzeichenbehaftete Verschiebungen. Die Zahl nach dem Bitcode gibt die Größe des Positionsdatensatzes an.
000 - 8 - Zwei volle Vier-Byte-Positionen 001 - 3 - Zwölf Bits für X und Y 010 - 2 - Zehn Bit für X und sechs Bit für Y 011 - 2 - Sechs-Bit-X und Zehn-Bit-Y 100 - 4 - Zwei sechzehn-Bit-Verschiebungen mit Vorzeichen 101 - 3 - Sechzehn-Bit-X- und 8-Bit-Y-Verschiebung mit Vorzeichen 110 - 3 - Acht-Bit-Verschiebung mit Vorzeichen für X; 16-Bit für Y 111 - 2 - Zwei Acht-Bit-Verschiebungen mit Vorzeichen
Ein Modusbyte von Null speichert alle für einen Punkt zutreffenden Informationen ohne Bezug zu einem früheren Punkt, so dass insgesamt 13 Bytes zur Speicherung von 12 Bytes nützlicher Informationen verwendet werden. Andere Modusbytes ermöglichen die Verdichtung von Datensätzen auf der Grundlage der Ähnlichkeit mit früheren Datensätzen. Wenn sich vier aufeinanderfolgende Datensätze nur im letzten Bit der ID unterscheiden und entweder X und Y innerhalb von +/- 127 des vorherigen Datensatzes liegen oder X innerhalb von +/- 31 und Y innerhalb von +/- 511 oder X innerhalb von +/- 511 und Y innerhalb von +/- 31, dann können alle vier Datensätze in 13 Byte gespeichert werden (durchschnittlich 3,25 Byte pro Datensatz, was einer Platzersparnis von 73 % entspricht).
Für die Komprimierung kann ein "gieriger" Algorithmus verwendet werden: Man untersucht einen Datensatz, um zu sehen, welche Größe ID und XY in der Ausgabe verwendet werden müssen, und nimmt dann bis zu drei weitere Datensätze auf, bis einer gefunden wird, der entweder nicht zu den vorherigen Datensätzen mit den gewählten Größen "passt" oder kleiner geschrieben werden könnte (man beachte, dass, wenn z.B. der erste Datensatz X- und Y-Verschiebungen hat, die beide gleich 12 sind, die XY mit zwei Bytes geschrieben werden würde, aber bis man die folgenden Datensätze liest, wüsste man nicht, welches der drei Zwei-Byte-Formate zu verwenden ist).
Bevor Sie Ihr Format in Stein meißeln, würde ich vorschlagen, Ihre Daten durchlaufen zu lassen. Es kann sein, dass eine kleine Anpassung (z. B. die Verwendung von 7+9 oder 5+11 Bit-Formaten anstelle von 6+10) viele Daten besser verpacken würde. Die einzige Möglichkeit, das herauszufinden, ist, zu sehen, was mit Ihren echten Daten passiert.