Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中膨胀这个zlib字节字符串?_Python_Zlib_Unicode String_Pako - Fatal编程技术网

如何在python中膨胀这个zlib字节字符串?

如何在python中膨胀这个zlib字节字符串?,python,zlib,unicode-string,pako,Python,Zlib,Unicode String,Pako,我正在编写一个与流行的数据仓库SaaS交互的工具。他们的在线sql编辑器将sql工作表序列化为JSON,但sql工作表的主体使用pako.js进行了zlib压缩。 我试图从python中读取并扩展这些zlib字符串,但我只能对包含短字符串的ByTestRing进行解码 sql文本的一个示例是字母a: 如果我包含一个分号a;,这无法解压缩: bytestring = b'x\xef\xbf\xbdK\xef\xbf\xbd\x06\x00\x00\xef\xbf\xbd\x00\xef\xbf\x

我正在编写一个与流行的数据仓库SaaS交互的工具。他们的在线sql编辑器将sql工作表序列化为JSON,但sql工作表的主体使用pako.js进行了zlib压缩。 我试图从python中读取并扩展这些zlib字符串,但我只能对包含短字符串的ByTestRing进行解码

sql文本的一个示例是字母a:

如果我包含一个分号a;,这无法解压缩:

bytestring = b'x\xef\xbf\xbdK\xef\xbf\xbd\x06\x00\x00\xef\xbf\xbd\x00\xef\xbf\xbd\n'
zlib.decompress(bytestring[4:-4], -15).decode('utf-8')
*** UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8f in position 1: invalid start byte
注意:我还尝试了使用“punycode”解码这些示例,我在javascript实现中找到了引用

我对zlib的理解非常有限,但我发现zlib字符串的前两个和最后四个字节是页眉/页脚,如果我们使用神奇的数字-15运行zlib,则可以对其进行修剪。完全有可能存在zlib magic number,它可以解压这些字符串,而不需要去掉页眉和页脚,但是当从-64循环到64时,我无法得到任何组合

我中断了联机sql工作表编辑器的保存和加载函数,发现它们正在使用pako zlib库pako.deflatea、{to:'string'}和pako.inflateb['body']、{to:'string'},并且我能够使用pako库在浏览器中对sql字符串进行膨胀/放气,但是,我们无法在python中重现相同的结果。

每个\xef\xbf\xbd序列都表示原始数据的损坏实例

在第一个示例中,第一个也是唯一的\xef\xbf\xbd应该是一个单字节,它是zlib头的第二个字节。在第二个示例中,第一个\xef\xbf\xbd应该是zlib头的第二个字节,第二个实例应该是\b4,第三个实例应该是\ff,第四个实例应该是\9b

在这一过程中,有些UTF-8处理不应该发生。每当它遇到一个设置了高位的字节时,它就会失败。在这些情况下,它用三字节UTF-8序列U+FFFD替换字节,这是用于表示未知字符的替换字符

归根结底,您的数据已损坏,无法修复。你需要修复上游发生的一切。您是否正在尝试使用复制和粘贴来获取数据?如果在黑色菱形中看到问号,则是该UTF-8字符。

每个\xef\xbf\xbd序列表示原始数据损坏的实例

在第一个示例中,第一个也是唯一的\xef\xbf\xbd应该是一个单字节,它是zlib头的第二个字节。在第二个示例中,第一个\xef\xbf\xbd应该是zlib头的第二个字节,第二个实例应该是\b4,第三个实例应该是\ff,第四个实例应该是\9b

在这一过程中,有些UTF-8处理不应该发生。每当它遇到一个设置了高位的字节时,它就会失败。在这些情况下,它用三字节UTF-8序列U+FFFD替换字节,这是用于表示未知字符的替换字符


归根结底,您的数据已损坏,无法修复。你需要修复上游发生的一切。您是否正在尝试使用复制和粘贴来获取数据?如果您在黑色菱形中看到一个问号,那就是UTF-8字符。

我同意这是一个数据损坏问题。zlib和pako应该能够读取彼此的数据,而无需删除任何字段或添加幻数

为了证明这一点,我收集了两个演示脚本,一个使用pako压缩数据,另一个使用zlib再次压缩数据:

//deflate.js var pako=require./pako.js; console.logescapepako.deflateprocess.argv[2],{to:string}; 充气 导入urllib.parse、zlib、sys printzlib.decompressurlib.parse.unquote_to_bytessys.stdin.read.decodeutf-8 使用deflate.js节点在命令行上运行它们,下面是一些示例文本| inflate.py。预期输出是传递给节点deflate.js的参数

关于pako,值得指出的一点是使用to:string选项时的行为。此选项的适用范围如下:

到字符串-如果等于“字符串”,则结果将是二进制字符串,每个字符代码为[0..255]

正是出于这个原因,我在上面的JavaScript函数中使用了escape。使用escape可以确保JavaScript和Python之间传递的字符串不包含任何非ASCII字符。请注意,encodeURIComponent不起作用,因为字符串包含二进制数据。然后,我在Python中使用urllib.parse.unquote_to_字节来撤消此转义


如果您可以在浏览器中转义pako deflated数据,您可能会将其传递给Python,以便再次对其进行膨胀。

我同意这是一个数据损坏问题。zlib和pako应该能够读取彼此的数据,而无需删除任何字段或添加magic num 贝尔斯

为了证明这一点,我收集了两个演示脚本,一个使用pako压缩数据,另一个使用zlib再次压缩数据:

//deflate.js var pako=require./pako.js; console.logescapepako.deflateprocess.argv[2],{to:string}; 充气 导入urllib.parse、zlib、sys printzlib.decompressurlib.parse.unquote_to_bytessys.stdin.read.decodeutf-8 使用deflate.js节点在命令行上运行它们,下面是一些示例文本| inflate.py。预期输出是传递给节点deflate.js的参数

关于pako,值得指出的一点是使用to:string选项时的行为。此选项的适用范围如下:

到字符串-如果等于“字符串”,则结果将是二进制字符串,每个字符代码为[0..255]

正是出于这个原因,我在上面的JavaScript函数中使用了escape。使用escape可以确保JavaScript和Python之间传递的字符串不包含任何非ASCII字符。请注意,encodeURIComponent不起作用,因为字符串包含二进制数据。然后,我在Python中使用urllib.parse.unquote_to_字节来撤消此转义


如果您可以在浏览器中转义pako deflated数据,您可能会将其传递给Python以再次膨胀。

唉,我无法控制该过程的JavaScript方面。@Sethish:您没有确切解释如何从存储在Python脚本中的任何位置获取序列化和/或压缩数据,但很明显,作为这个过程的一部分,数据正在被破坏。我希望我的回答能提供一些提示,如果您能够解决此数据损坏问题,那么您应该能够读取压缩数据。在使用python进行解压缩时,我在示例中得到了“zlib.error:error-3 when decompressing data:error header check”。您使用的是什么版本的pako和python?@BluePie:pako 1.0.11,python 3.7.3。@感谢LukeWoodward,pako 2.x是问题所在,唉,我无法控制这个过程的JavaScript方面。@Sethish:您没有确切解释如何从存储在python脚本中的任何位置获取序列化和/或压缩数据,但很明显,作为这个过程的一部分,数据正在被破坏。我希望我的回答能提供一些提示,如果您能够解决此数据损坏问题,那么您应该能够读取压缩数据。在使用python进行解压缩时,我在示例中得到了“zlib.error:error-3 when decompressing data:error header check”。你使用了什么版本的pako和python?@BluePie:pako 1.0.11,python 3.7.3.@LukeWoodward谢谢,pako 2.x是问题所在,
bytestring = b'x\xef\xbf\xbdK\xef\xbf\xbd\x06\x00\x00\xef\xbf\xbd\x00\xef\xbf\xbd\n'
zlib.decompress(bytestring[4:-4], -15).decode('utf-8')
*** UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8f in position 1: invalid start byte