У меня проблема с записью несжатого потока GZIP с использованием GZipInputStream от SharpZipLib. Кажется, я могу получить только 256 байтов данных, остальные не записываются и обнуляются. Сжатый поток (ressedSection) был проверен, и все данные там (1500+ байтов). Ниже приведен фрагмент процесса декомпрессии:
int msiBuffer = 4096;
using (Stream msi = new MemoryStream(msiBuffer))
{
msi.Write(compressedSection, 0, compressedSection.Length);
msi.Position = 0;
int uncompressedIntSize = AllMethods.GetLittleEndianInt(uncompressedSize, 0); // Gets little endian value of uncompressed size into an integer
// SharpZipLib GZip method called
using (GZipInputStream decompressStream = new GZipInputStream(msi, uncompressedIntSize))
{
using (MemoryStream outputStream = new MemoryStream(uncompressedIntSize))
{
byte[] buffer = new byte[uncompressedIntSize];
decompressStream.Read(buffer, 0, uncompressedIntSize); // Stream is decompressed and read
outputStream.Write(buffer, 0, uncompressedIntSize);
using (var fs = new FileStream(kernelSectionUncompressed, FileMode.Create, FileAccess.Write))
{
fs.Write(buffer, 0, buffer.Length);
fs.Close();
}
outputStream.Close();
}
decompressStream.Close();
Итак, в этом фрагменте:
1) Сжатый раздел передан, готов к распаковке.
2) Ожидаемый размер несжатого вывода (который хранится в заголовке с файлом как 2-байтовое значение с прямым порядком байтов) передается через метод для преобразования его в целое число. Заголовок удаляется ранее, поскольку он не является частью сжатого файла GZIP.
3) Поток GZIP SharpLibZip объявляется с потоком сжатого файла (msi) и буфером, равным int uncompressedIntSize (протестировано со статическимтакже значение 4096).
4) Я настроил MemoryStream для обработки записи вывода в файл, так как GZipInputStream не имеет Read / Write;он принимает ожидаемый размер распакованного файла в качестве аргумента (емкость).
5) Для чтения / записи потока необходим массив byte [] в качестве первого аргумента, поэтому я установил массив byte [] с достаточным количествомпространство для взятия всех байтов распакованного вывода (3584 байта в данном случае, полученного из uncompressedIntSize).
6) int GzipInputStream декомпрессия Stream использует .Read с буфером в качестве первого аргумента, из смещения 0, используя uncompressedIntSizeкак граф. При проверке приведенных здесь аргументов буферный массив по-прежнему имеет емкость 3584 байта, но ему предоставлено только 256 байтов данных. Остальные нули.
Похоже, что вывод .Read сокращен до 256 байт, но я не уверен, где. Есть ли что-то, что я пропустил в Streams, или это ограничение .Read?