问题
我尝试做什么:
1。蟒
def deflate_and_base64_encode( string_val ):
zlibbed_str = zlib.compress( string_val )
compressed_string = zlibbed_str[2:-1]
return base64.b64encode(compressed_string )
2。 C#
public static string Inflate(string pythonZipped)
{
byte[] gzBuffer = Convert.FromBase64String(pythonZipped);
using (var ms = new MemoryStream())
{
ms.Write(gzBuffer, 0, gzBuffer.Length);
var buffer = new byte[ms.Length];
ms.Position = 0;
using (var infS = new DeflateStream(ms,Ionic.Zlib.CompressionMode.Decompress, true))
{
infS.Read(buffer, 0, buffer.Length);
}
return Encoding.UTF8.GetString(buffer);
}
}
但是得到一些奇怪的结果,例如:
Python.deflate_and_base64_encode('1'*1000)
MzQcBaNgFAx3AABQpr8=
C#.Inflate("MzQcBaNgFAx3AABQpr8")
结果为11111111111111
而不是1000个
你能解释一下我做错了什么或给我其他方法来实现我的目标吗?
答案 0 :(得分:0)
问题开始时,从开头的2个字符和从最后的一个字符被切断。 compressed_string = zlibbed_str[2:-1]
这行代码会破坏前2个字符中的标题信息,即使是立即的zlib.decompress也无法理解剩下的内容。 (我的猜测:C#的zlib实现尽力重建没有有效头的流的左边.Python' s,正如你在下面看到的那样,更严格。)
>>> import zlib
>>> z = zlib.compress('1'*1000)
>>> c = z[2:-1]
>>> zlib.decompress(z)
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'
>>> zlib.decompress(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
答案 1 :(得分:0)
我遇到了同样的问题。 我解决了。
“var buffer = new byte [ ms.Length ];”导致这个问题。
缓冲区大小太小。
增加缓冲区大小,例如“var buffer = new byte [ 4096 ];” 或“var buffer = new byte [ ms.Length * 1024 ];”。