gpt4 book ai didi

c# - C#解压的问题

转载 作者:行者123 更新时间:2023-11-30 19:33:54 25 4
gpt4 key购买 nike

我想在 C# 应用程序中使用的 sybase 图像类型列中有一些数据。 Java 使用 java.util.zip 包对数据进行了压缩。我想测试我是否可以在 C# 中解压缩数据。所以我写了一个测试应用程序,把它从数据库中拉出来:

byte[] bytes = (byte[])reader.GetValue(0);  

这给了我一个长度为 2479 的压缩 byte[]。
然后我将其传递给一个看似标准的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。怎么了?吉姆

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);
}

最佳答案

由于我看不到您的 Java 代码,我只能猜测您正在将数据压缩为 zip 文件流。因此,如果您尝试在 c# 中使用 gzip 解压缩来解压缩该流,它显然会失败。您可以将 Java 代码更改为 gzip 压缩(页面底部的示例 here),或者使用适当的库(例如 SharpZipLib)解压缩 c# 中的 zip 文件流。

更新

现在好了,我看到你在 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;
}

关于c# - C#解压的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2721230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com