【问题标题】:Compress string in php and decompress in python using zlib使用zlib在php中压缩字符串并在python中解压缩
【发布时间】:2020-09-16 11:26:28
【问题描述】:

我知道那里已经有人问过这个问题:Compress string in php and decompress in python

但没有提供答案(聊天中的讨论已丢失)。

我希望 PHP 客户端在其一侧压缩一个字符串,将其作为包含在 json 中的字符串发送到服务器,然后我希望能够在我一侧对其进行解压缩。

我用 zlib 试过了:

$ php -a
Interactive shell

php > $msg = "abcdefghijk";
php > $compressed = gzcompress($msg);
php > echo "'".$compressed."'"
php > ;
'x�KLJNIMK�����c'


$ python3
Python 3.7.8 (heads/master-dirty:daa285d, Jul 28 2020, 20:00:50) 
[GCC 9.3.1 20200408 (Red Hat 9.3.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import zlib
>>> comp_msg=r'x�KLJNIMK�����c'
>>> msg = zlib.decompress(comp_msg.encode('utf-8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check

...但它不起作用。 我猜这是字符串编码的问题,但是使用 PHP 的 mb_convert_encoding($compressed, "UTF-8");不能解决问题。

由于缺乏声誉,我不能问第一次出现这个问题的创造者...... 任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 可能窗口大小不同,PHP 和 Python 可能使用不同的默认值。您可以在解压缩时指定此值:zlib.decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) 和/或在 PHP 中进行压缩。
  • 此值在 zlib python 中明确公开,但在 PHP 的 gzcompress 中没有:php.net/manual/en/function.gzcompress.php 此外,在后面的页面中,我在评论中发现:“gzipped strings include header/metadata you can use to确定一个字符串是否被压缩,但由于 gzcompress 不包括我发现自己需要一种方法来确定一个字符串是否被压缩。”这与我的错误消息一致:“不正确的标头检查”
  • 'x�KLJNIMK�����c' 看起来像是压缩字节的字符串表示,而不是字节本身。是否可以将它们编码为base64,然后在解压缩之前在python中解码base64?

标签: python php encoding compression zlib


【解决方案1】:
  1. 尝试转义字符串常量中的非 ASCII 字符:
<?php
$msg = "abcdefghijk";
$compressed = gzcompress($msg);
echo "'".addcslashes($compressed, "\x00..\x1F\\\'\"\x7F..\xFF")."'";
// outputs: 'x\234KLJNIMK\317\310\314\312\006\000\031\351\004c'
  1. 尝试在python中对二进制字符串文字使用b前缀:
import zlib
comp_msg=b'x\234KLJNIMK\317\310\314\312\006\000\031\351\004c';
msg = zlib.decompress(comp_msg)
print(msg)
# prints: b`abcdefghijk`

【讨论】:

  • 完美!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多