Если у вас есть гибкость в изменении вашего формата, я мог бы предложить это. Определите сжатый поток так, чтобы он представлял собой последовательность с неизвестным числом блоков, и каждому блоку предшествует целое число фиксированной длины, указывающее количество байтов в блоке. Поток заканчивается, когда следующий блок имеет размер ноль.
Недостаток этого формата в том, что у читателя потока нет возможности узнать, сколько данных поступает, пока они все не будут прочитаны. Но преимущество в том, что он избегает проблемы, которую вы пытаетесь решить.
Что еще более важно, он позволяет вам отправлять сжатый поток данных куда-то, когда вы читаете ввод, и вам не нужно сохранять все это перед отправкой. Например, вы можете написать сжатый Unix-фильтр, который вы можете поместить в конвейерный поток:
prog1 | yourprog -compress | rsh host yourprog -expand | prog2
Удачи.