Получить размер несжатых данных в zlib?

Для меня эта проблема была исправлена ​​добавлением

file://

прямо перед адресом пути к файлу, например:

var filePath = "file://\(fileURLpath)"
5
задан AriX 30 May 2009 в 13:50
поделиться

3 ответа

В формате zlib нет поля для исходного размера ввода, поэтому я сомневаюсь, что вы сможете сделать это без имитации распаковки данных. Формат gzip имеет поле «размер ввода» ( ISIZE ), которое вы могли бы использовать, но, возможно, вы хотите избежать изменения формата сжатия или того, чтобы клиенты отправляли размер файла.

Но даже если вы используете другой формат, если вы не доверяете клиентам, вам все равно придется выполнить более дорогостоящую проверку, чтобы убедиться, что несжатые данные имеют размер, заявленный клиентом. В этом случае вы можете сделать процесс uncompress-to- / dev / null менее затратным, убедившись, что zlib никуда не записывает выходные данные, поскольку вы просто хотите знать несжатые размер.

3
ответ дан 13 December 2019 в 19:34
поделиться

Сомневаюсь. Я не верю, что это то, что базовые библиотеки zlib предоставляют из памяти (хотя прошло уже 7 или 8 лет с тех пор, как я ее использовал, обновленные документы, похоже, не указывают, что эта функция была добавлена).

Одной из возможностей может быть передача другого файла, который содержит несжатый размер (например, передача как file.zip , так и file.zip.size ), но это кажется чревато опасностью, особенно если вы неправильно указали размер.

Другой альтернативой является, если распаковка сервера требует больших затрат времени, но не требует немедленного выполнения, сделать это в фоновой задаче с более низким приоритетом (например, с nice под Linux). Но опять же, могут быть недостатки, если средство проверки размера начинает отставать (поступает слишком много загрузок).

4
ответ дан 13 December 2019 в 19:34
поделиться

Если вы загружаете с использованием необработанного формата сжатия, у вас не будет информации о размере загружаемых данных. Пакс в этом отношении прав.
Вы можете сохранить его как 4-байтовый заголовок в начале буфера сжатия - при условии, что размер файла не превышает 4 ГБ.
некоторый код на языке C в качестве примера:

 uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0);
 uLongf compressedSize = bufsize;
 *((uLongf *)compressBuffer) = filesize;
 compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize);

Затем вы отправляете полный файл compressBuffer размера compressedSize + sizeof (uLongf). Когда вы получаете его на стороне сервера, вы можете использовать следующий код для возврата данных:

 // data is in compressBuffer, assume you already know compressed size.
 uLongf originalSize = *((uLongf *)compressBuffer);
 uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf);

Если вы не доверяете клиенту отправку правильного размера, вам нужно будет выполнить какую-то проверку несжатых данных на размер сервера. Предложение использовать распаковку в / dev / null является разумным.
Если вы загружаете файл .zip, он содержит каталог, в котором указывается размер файла в несжатом виде. Эта информация, опять же, встроена в формат файла, хотя это и доступно для злоумышленников.

4
ответ дан 13 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: