Есть некоторые данные в столбце типа изображения Sybase, которые я хочу использовать в приложении C #. Данные были сжаты Java с использованием пакета java.util.zip. Я хотел проверить, что я могу распаковать данные в C #. Поэтому я написал тестовое приложение, которое извлекает его из базы данных:
byte[] bytes = (byte[])reader.GetValue(0);
Это дает мне сжатый байт [] длиной 2479.
Затем я передаю это, казалось бы, стандартному методу декомпрессии C #:
public static byte[] Decompress(byte[] gzBuffer)
{
MemoryStream ms = new MemoryStream();
int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
GZipStream zip = new GZipStream(ms, CompressionMode.Decompress);
zip.Read(buffer, 0, buffer.Length);
return buffer;
}
Значение для msgLength равно 1503501432, что, кажется, выходит за пределы допустимого диапазона. Оригинальный документ должен быть в диапазоне 5K-50K. В любом случае, когда я использую это значение для создания «буфера», неудивительно, что я получаю исключение OutOfMemoryException.
Что происходит?
Jim
Метод сжатия Java выглядит следующим образом:
public byte[] compress(byte[] bytes) throws Exception {
byte[] results = new byte[bytes.length];
Deflater deflator = new Deflater();
deflater.setInput(bytes);
deflater.finish();
int len = deflater.deflate(results);
byte[] out = new byte[len];
for(int i=0; i<len; i++) {
out[i] = results[i];
}
return(out);
}