Не видя данных и их точного распределения, я не могу с уверенностью сказать, какой метод лучше, но я бы посоветовал начинать каждую группу из 1-4 записей с байта, 8 бит которого указывают на следующее:
0-1 Количество байтов идентификатора, которые должны быть заимствованы из предыдущей записи. 2-4 Формат записи позиции 6-7 Количество последовательных записей, которые используют один и тот же байт режима
Каждая позициязапись может храниться одним из восьми способов;все типы, кроме 000, используют подписанные смещения.Число после битового кода соответствует размеру записи позиции.
000 - 8 - две полных четырехбайтовых позиции 001 - 3 - двенадцать битов для X и Y 010 - 2 - десятиразрядная X и шестьбита Y 011 - 2 - шестибитовые X и десятиразрядные Y 100 - 4 - два смещения шестнадцатиразрядных со знаком 101 - 3 - шестнадцатибитные X и 8-битные смещения Y со знаком 110 - 3 - восьмибитные смещения со знакомдля X;16 бит для Y 111 - 2 - два восьмибитных смещения со знаком
Нулевой байт режима будет хранить всю информацию, относящуюся к точке, без ссылки на какую-либо предыдущую точку, используя для хранения всего 13 байтов12 байт полезной информации.Байты другого режима позволят сжать записи на основе сходства с предыдущими записями.Если четыре последовательные записи отличаются только последним битом идентификатора, и либо имеют X и Y в пределах +/- 127 от предыдущей записи, либо X в пределах +/- 31 и Y в пределах +/- 511, либо X в пределах+/- 511 и Y в пределах +/- 31, тогда все четыре записи могут храниться в 13 байтах (в среднем по 3,25 байта каждая (сокращение на 73%).
«жадный» алгоритм можетиспользоваться для сжатия: проверьте запись, чтобы увидеть, какой идентификатор размера и XY он будет использовать в выходных данных, а затем захватите до трех дополнительных записей, пока не будет найдена одна, которая не может «соответствовать» предыдущим записям, используявыбранные размеры или могут быть записаны меньшими размерами (обратите внимание, что, если, например, первая запись имеет смещения X и Y, равные 12, XY будет записан двумя байтами, но до тех пор, пока одна из них не прочитает следующие записи, никто не будет знать, какая из трехиспользование двухбайтовых форматов).
Прежде чем устанавливать формат в камне, я рекомендую пропустить ваши данные через него. Возможно, это небольшая настройка (например, использование 7 + 9 или 5 + 11 битформаты вместо 6 + 10) позволят упаковывать многие данные лучше.Однако единственный реальный способ узнать это - посмотреть, что происходит с вашими реальными данными.