2023-02-10 20:43:03
Для нашей бинарной сериализации хотелось бы иметь возможность писать не только на уровне байт, но и на уровне бит. Первая реализация была сделана с помощью крейта bitvec (отличный крейт, кстати). Это позволило проверить всё в деле, но занявшись оптимизацией убедился что нужны более специализированные решения. Плюс, если писать все в виде последовательности бит, возникают ситуации когда из-за записанного була, например, возникает смещение, которое замедляет дальнейшую сериализацию.
В итоге сейчас делаю гибридный вариант, который пишет по возможности все байтами, а если нужно записать бит, то пишет бит.
Решение довольно простое, но я не видел подобного похода:
буффер представляет собой вектор u8 и когда нам надо записать байты, мы напрямую пишем их в вектор, а если нам надо записать биты, то выделяем байт в конце буфера под запись битов и пока он не будет заполнен все биты пишем туда.
Например:
пишем байт
[
1111 1111]
пишем после этого один бит
[1111 1111][0000 000
1]
следом 2 байта
[1111 1111][0000 0001]
[1111 1111]
[1111 1111]
пишем 3 бита
[1111 1111][0000
1111][1111 1111][1111 1111]
и тд
За счет того, что сериализация/десериализация симметричная, при чтении проблем не возникнет.
853 viewsDmitriy Kolesnik, 17:43