Контекст: я использую файл .mbtiles, формат файла геомапинга, который представляет собой файл базы данных sqlite, содержащий векторные плитки.
Эти векторные листы упаковываются с использованием буфера протокола и затем распаковываются.
Я использую C ++ и сейчас читаю пример декомпрессии использования zlib, но я не уверен, как обрабатывать чанки и событие конца потока.
SQLite дает мне указатель void * и длину.
Я цитирую страницу:
Для приложений, где потоки zlib встроены в другие данные, это
рутина должна быть изменена, чтобы возвратить неиспользованные данные, или в
хотя бы указать, какая часть входных данных не использовалась, поэтому
Приложение будет знать, где взять после потока ZLIB.
Методы класса буфера протокола принимают либо void *, либо std :: string. Я думаю, что я должен идти с void *.
Я не уверен, как эти события работают, и пример, кажется, не обеспечивает случай для байтовых массивов. Как мне изменить код, чтобы избежать ошибок?
Похоже, что SQLite дает вам поток zlib без чего-либо после него. Если так, то этот комментарий не применяется.
В любом случае, вы смотрите на правильная страница. (Вы не сказали, что такое «страница», но я узнаю цитату, так как написал ее.) Это показывает, как в целом использовать функции zlib. Вы должны быть в состоянии выяснить, как применить его к байтовому массиву вместо ввода файла.
Если данные действительно «сжаты», то вам нужно будет использовать inflateInit2()
вместо inflateInit()
, Прочитайте zlib документация в zlib.h.
Других решений пока нет …