我正在尝试使用zlib的deflate来扩充一个字符串,但它失败了,显然是因为它没有正确的标题。我在别处读到这个问题的C#解决方案是:
public static byte[] FlateDecode(byte[] inp, bool strict) {
MemoryStream stream = new MemoryStream(inp);
InflaterInputStream zip = new InflaterInputStream(stream);
MemoryStream outp = new MemoryStream();
byte[] b = new byte[strict ? 4092 : 1];
try {
int n;
while ((n = zip.Read(b, 0, b.Length)) > 0) {
outp.Write(b, 0, n);
}
zip.Close();
outp.Close();
return outp.ToArray();
}
catch {
if (strict)
return null;
return outp.ToArray();
}
}
但我对C#一无所知。我可以猜测它正在做的就是为字符串添加一个前缀,但是那个前缀是什么,我不知道。有人能用C ++来表达这个函数(甚至只是标题创建和字符串连接)吗?
我试图膨胀的数据来自使用zlib通缩的PDF。
万分感谢 悦
答案 0 :(得分:1)
对于zlib
互操作,使用SharpZipLib比使用本机.Net Framework类更好。这正确地处理来自C ++(zlib
native)和Java压缩类的流,而不需要任何有趣的业务。
答案 1 :(得分:0)
我看不到任何前缀,抱歉。这是逻辑似乎是什么;对不起,这不是在C ++中:
MemoryStream stream = new MemoryStream(inp);
InflaterInputStream zip = new InflaterInputStream(stream);
根据传递的数据创建一个膨胀流
MemoryStream outp = new MemoryStream();
为输出
创建内存缓冲区流byte[] b = new byte[strict ? 4092 : 1];
try {
int n;
while ((n = zip.Read(b, 0, b.Length)) > 0) {
如果您处于严格模式,read up to 4092 bytes - 或非严格模式下的1 - 进入字节缓冲区
outp.Write(b, 0, n);
将解码后的所有字节(可能小于4092)写入输出内存缓冲流
zip.Close();
outp.Close();
return outp.ToArray();
清理并将输出内存缓冲区流作为数组返回。
我有点困惑:为什么不在b
个元素处删除数组n
并返回而不是通过MemoryStream
?代码也应该注意清理内存流和zip
异常(例如使用using
),因为它们都是IDisposable
但是我认为这并不重要因为它们不对应于I / O文件句柄,只对应于内存结构。