在sybase图像类型列中包含一些我想在C#应用程序中使用的数据.Java使用java.util.zip包压缩了数据.我想测试我可以解压缩C#中的数据.所以我编写了一个测试应用程序,将其从数据库中删除:
byte[] bytes = (byte[])reader.GetValue(0);
Run Code Online (Sandbox Code Playgroud)
这给了我一个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;
}
Run Code Online (Sandbox Code Playgroud)
msgLength的值是1503501432,这似乎超出了范围.原始文件应在5K-50k的范围内.无论如何,当我使用该值创建"缓冲区"时,我得到一个OutOfMemoryException.怎么了?吉姆
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);
}
Run Code Online (Sandbox Code Playgroud)
由于我无法看到您的java代码,我只能猜测您正在将数据压缩为zip文件流.因此,如果您尝试使用c#中的gzip解压缩来解压缩该流,则显然会失败.要么你(例改变你的Java代码到gzip压缩这里在页面的底部),或者你有一个合适的库(如解压缩在C#中的zip文件流SharpZipLib).
更新
好了,我看到你在java中使用deflate进行压缩.所以,显然你必须在c#中使用相同的算法:System.IO.Compression.DeflateStream
public static byte[] Decompress(byte[] buffer)
{
using (MemoryStream ms = new MemoryStream(buffer))
using (Stream zipStream = new DeflateStream(ms,
CompressionMode.Decompress, true))
{
int initialBufferLength = buffer.Length * 2;
byte[] buffer = new byte[initialBufferLength];
bool finishedExactly = false;
int read = 0;
int chunk;
while (!finishedExactly &&
(chunk = zipStream.Read(buffer, read, buffer.Length - read)) > 0)
{
read += chunk;
if (read == buffer.Length)
{
int nextByte = zipStream.ReadByte();
// End of Stream?
if (nextByte == -1)
{
finishedExactly = true;
}
else
{
byte[] newBuffer = new byte[buffer.Length * 2];
Array.Copy(buffer, newBuffer, buffer.Length);
newBuffer[read] = (byte)nextByte;
buffer = newBuffer;
read++;
}
}
}
if (!finishedExactly)
{
byte[] final = new byte[read];
Array.Copy(buffer, final, read);
buffer = final;
}
}
return buffer;
}
Run Code Online (Sandbox Code Playgroud)