Как правильно работать с zlib::inflate_stream::write? ⇐ C++
-
Гость
Как правильно работать с zlib::inflate_stream::write?
Я пытаюсь понять мелкие детали работы с zlib::inflate_stream::write. Код примерно такой:
zlib::z_params params; zlib::inflate_stream раздувать; params.data_type = zlib::binary; params.avail_in = inBufferSize; params.next_in = inBuffer; params.avail_out = outBufferSize; params.next_out = outBuffer; boost::beast::error_code boostErrorCode; inflate.write(zParams, zlib::Flush::finish, boostErrorCode); Это не мой код, поэтому я предпочитаю не менять zlib::Flush::finish, хотя часто входные данные поступают пакетно.
Вот что я понимаю:
Перед звонком:
параметры такие же, как и ожидалось:avail_in — это количество байтов во входном буфере, то есть next_in. Avail_out — это размер выходного буфера — Avail_out.
После звонка:
[*]avail_in — это количество байт, оставшихся во входном буфере, которые не были использованы. [*]next_in — все байты, предшествующие этому, были использованы. Этот и последующие байты не использовались. [*]avail_out — объем данных, записанных в выходной буфер. [*]next_out — записанные данные были записаны до этого момента, не считая.
Мои вопросы:
[*]Сжатые данные хранятся в битах, а не в байтах. Могу ли я быть уверен, что все биты из байтов, использованных во входном буфере, были разложены. Могу ли я быть уверен, что все биты в байте, указанные в next_out, не были использованы? [*]Если входной буфер содержит сжатые данные, а после него — несжатые данные? Распознает ли zlib несжатые данные и завершится раньше или выдаст какую-то ошибку? [*]Если входной буфер содержит два блока данных, каждый из которых сжимается отдельно, узнает ли zlib разницу между ними и остановится перед вторым? Будет ли он распаковывать оба? [*]Предполагая, что входные данные поступают частями, как мне узнать, закончил ли я распаковку данных?
Я также буду признателен за обсуждение вышеуказанного вопроса с вариацией параметра Flush.
Спасибо
Я пытаюсь понять мелкие детали работы с zlib::inflate_stream::write. Код примерно такой:
zlib::z_params params; zlib::inflate_stream раздувать; params.data_type = zlib::binary; params.avail_in = inBufferSize; params.next_in = inBuffer; params.avail_out = outBufferSize; params.next_out = outBuffer; boost::beast::error_code boostErrorCode; inflate.write(zParams, zlib::Flush::finish, boostErrorCode); Это не мой код, поэтому я предпочитаю не менять zlib::Flush::finish, хотя часто входные данные поступают пакетно.
Вот что я понимаю:
Перед звонком:
параметры такие же, как и ожидалось:avail_in — это количество байтов во входном буфере, то есть next_in. Avail_out — это размер выходного буфера — Avail_out.
После звонка:
[*]avail_in — это количество байт, оставшихся во входном буфере, которые не были использованы. [*]next_in — все байты, предшествующие этому, были использованы. Этот и последующие байты не использовались. [*]avail_out — объем данных, записанных в выходной буфер. [*]next_out — записанные данные были записаны до этого момента, не считая.
Мои вопросы:
[*]Сжатые данные хранятся в битах, а не в байтах. Могу ли я быть уверен, что все биты из байтов, использованных во входном буфере, были разложены. Могу ли я быть уверен, что все биты в байте, указанные в next_out, не были использованы? [*]Если входной буфер содержит сжатые данные, а после него — несжатые данные? Распознает ли zlib несжатые данные и завершится раньше или выдаст какую-то ошибку? [*]Если входной буфер содержит два блока данных, каждый из которых сжимается отдельно, узнает ли zlib разницу между ними и остановится перед вторым? Будет ли он распаковывать оба? [*]Предполагая, что входные данные поступают частями, как мне узнать, закончил ли я распаковку данных?
Я также буду признателен за обсуждение вышеуказанного вопроса с вариацией параметра Flush.
Спасибо
Мобильная версия