gpt4 book ai didi

java - Python 上的 zlib.compress 和 Java (Android) 上的 Deflater.deflate 兼容吗?

转载 作者:太空狗 更新时间:2023-10-29 22:24:02 33 4
gpt4 key购买 nike

我正在将一个 Python 应用程序移植到 Android,在某些时候,这个应用程序必须与 Web 服务通信,向它发送压缩数据。

为了做到这一点,它使用了下一个方法:

def stuff(self, data):
"Convert into UTF-8 and compress."
return zlib.compress(simplejson.dumps(data))

我正在使用下一个方法尝试在 Android 中模拟此行为:

private String compressString(String stringToCompress)
{
Log.i(TAG, "Compressing String " + stringToCompress);
byte[] input = stringToCompress.getBytes();
// Create the compressor with highest level of compression
Deflater compressor = new Deflater();
//compressor.setLevel(Deflater.BEST_COMPRESSION);
// Give the compressor the data to compress
compressor.setInput(input);
compressor.finish();
// Create an expandable byte array to hold the compressed data.
// You cannot use an array that's the same size as the orginal because
// there is no guarantee that the compressed data will be smaller than
// the uncompressed data.
ByteArrayOutputStream bos = new ByteArrayOutputStream(input.length);
// Compress the data
byte[] buf = new byte[1024];
while (!compressor.finished())
{
int count = compressor.deflate(buf);
bos.write(buf, 0, count);
}

try {
bos.close();
} catch (IOException e)
{

}
// Get the compressed data
byte[] compressedData = bos.toByteArray();

Log.i(TAG, "Finished to compress string " + stringToCompress);

return new String(compressedData);
}

但是服务器的HTTP响应不正确,我猜是因为Java压缩的结果和Python压缩的结果不一样。

我用 zlib.compress 和 deflate 运行了一个压缩“a”的小测试。

Python,zlib.compress() -> x%9CSJT%02%00%01M%00%A6

Android, Deflater.deflate -> H%EF%BF%BDK%04%00%00b%00b

Android中如何压缩数据才能得到Python中zlib.compress()的相同值?

非常感谢任何帮助、指导或指示!

最佳答案

compress 和 deflate 是不同的压缩算法,所以答案是它们不兼容。这里的区别示例是通过 Tcl 使用两种算法压缩“a”:

% binary encode hex [zlib compress a]
789c4b040000620062
% binary encode hex [zlib deflate a]
4b0400

您的 python 代码确实在进行压缩。 android 代码正在放气,但是您还得到了添加到 android 版本 (\xef\xbf\xbf) 之前的 UTF-8 字节顺序标记

您可以使用 python 发出压缩数据:

def deflate(data):
zobj = zlib.compressobj(6,zlib.DEFLATED,-zlib.MAX_WBITS,zlib.DEF_MEM_LEVEL,0)
zdata = zobj.compress(data)
zdata += zobj.flush()
return zdata
>>> deflate("a")
'K\x04\x00'

关于java - Python 上的 zlib.compress 和 Java (Android) 上的 Deflater.deflate 兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2424945/

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