У меня есть файл, который я не могу изменить, который состоит из 3 сцепленных данных zlib. Данные не очень большие (несколько сотен килобайт). Как я могу их прочитать? Есть функция Qt qUncompress()
(отредактированная), но она принимает длину в качестве аргумента, и я не знаю, какова фактическая длина потока.
Решение 1: Когдачтение данных через поток, код, который я вижу для выполнения этого блока чтения данных и остановки при возникновении ошибки. Проблема заключается в том, что «чтение фиксированного фрагмента данных» будет использовать этот фрагмент, и поток будет поврежден, если размер потока не точно кратен N.
Псевдокод:
while (no error) {
read N bytes
decompress_next(these N bytes)
}
... Here there may be up to N-1 totally skipped bytes...
Это работает, когда N = 1, но я чувствую себя немного хакером. Есть ли лучшая альтернатива?
Решение 2: Распакуйте поток, сожмите снова и получите размер первого куска. Перейдите к смещению, а затем прочитайте и т. Д. (Это не должно применяться, когда входной поток недоступен для записи, но это должно работать в моей ситуации)код нетривиален.
Это может быть невозможно, и я не очень разбираюсь в алгоритме zlib, если он знает, когда заканчивается поток, или просто читает данные без состояния.
Изменить: Утилита zlib-flate похоже, чтобы сделать это для решения № 2, так что, по-видимому, это возможно