C# SharpZipLib Не удается прочитать поток при попытке распаковать zip в Unity3D
Я использую ICSharpCode.SharpZipLib, чтобы попытаться разархивировать файл из Интернета, все, что мне нужно сделать, это получить несжатый массив байтов. Однако я получаю ошибку "InvalidOperationException: невозможно прочитать из этого потока". Я работаю в C# в Unity3D с целью в качестве веб-игрока. Это, очевидно, читабельно, поэтому я не уверен в проблеме. Вот мой код, и любая помощь будет принята с благодарностью.
using (MemoryStream s = new MemoryStream(bytes))
{
using (BinaryReader br = new BinaryReader(s))
{
using (ICSharpCode.SharpZipLib.Zip.ZipInputStream zip = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(s))
{
byte[] bytesUncompressed = new byte[32768];
while (true)
{
Debug.Log("can read: " + zip.CanRead);
int read = zip.Read(bytesUncompressed, 0, bytesUncompressed.Length);
if (read <= 0)
break;
zip.Write(bytesUncompressed, 0, read);
}
}
}
}
2 ответа
Пример шаблона довольно болезненный, позвольте мне дать вам "лучший (tm)" шаблон для использования.
byte[] GetBytesFromCompressedStream(MemoryStream src)
{
byte[] uncompressedBytes = null;
using (MemoryStream dst = new MemoryStream())
using (ICSharpCode.SharpZipLib.Zip.ZipInputStream zip = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(src))
{
byte[] buffer = new byte[16 * 1024];
int read = -1;
while((read = zip.Read(buffer, 0, buffer.Length)) > 0)
{
dst.Write(buffer, 0, read);
}
uncompressedBytes = dst.ToArray();
}
return uncompressedBytes;
}
Мне неясно, как вы заполняете свой поток s
, но все, что вам может понадобиться, это откатить позицию вашего потока перед прочтением:
s.Seek(0, System.IO.SeekOrigin.Begin);