Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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中从actionscript读取base64/zlib编码字符串_Python_Actionscript_Base64_Zlib - Fatal编程技术网

在python中从actionscript读取base64/zlib编码字符串

在python中从actionscript读取base64/zlib编码字符串,python,actionscript,base64,zlib,Python,Actionscript,Base64,Zlib,我将一个字符串保存到一个数据库中,该数据库由Actionscript通过base64编码,然后zlib压缩它 示例字符串如下:“Enrj4mzkrshgwdhbx1mumjfnoschiacuhbci=” 如果我通过Actionscript解压和解压base64,我会得到我所期望的: {“xp”:656398,“等级”:34} 但是,我还需要能够阅读这个服务器端。目前,我正在使用Python,但我愿意接受一个可用的PHP解决方案或类似的解决方案 到目前为止,我已经在Python中尝试了以下方法:

我将一个字符串保存到一个数据库中,该数据库由Actionscript通过base64编码,然后zlib压缩它

示例字符串如下:“Enrj4mzkrshgwdhbx1mumjfnoschiacuhbci=”

如果我通过Actionscript解压和解压base64,我会得到我所期望的:

{“xp”:656398,“等级”:34}

但是,我还需要能够阅读这个服务器端。目前,我正在使用Python,但我愿意接受一个可用的PHP解决方案或类似的解决方案

到目前为止,我已经在Python中尝试了以下方法:

import base64
import zlib

s = 'eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI='

print s.decode("base64").decode("zlib")
看起来Actionscript在标题中添加了一些额外的位,但我的Python不够强大,无法克服这一点:)任何帮助都将不胜感激


编辑:Actionscript首先接受一个AS对象并将其转换为ByteArray,然后zlib对其进行压缩并将其基化。看起来这就是生成额外标头/损坏数据信息的原因。

在我看来,Python脚本的解码顺序不正确。如果您所说的编码顺序是正确的,首先是base64,然后是zlib,那么您必须按照相反的顺序解码:

print s.decode("zlib").decode("base64")

在我看来,Python脚本的解码顺序是错误的。如果您所说的编码顺序是正确的,首先是base64,然后是zlib,那么您必须按照相反的顺序解码:

print s.decode("zlib").decode("base64")

Tosh,您说您首先对数据进行base64编码,然后在将其存储到数据库之前对其进行压缩。到目前为止还不错。压缩数据后,它是二进制数据。因此,我假设您已将此数据以二进制格式存储在数据库中。现在给我们看一个字符串:

示例字符串如下:“Enrj4mzkrshgwdhbx1mumjfnoschiacuhbci=”

根据您的说法,这表示压缩的数据。现在,有一个矛盾。一方面,压缩的数据是二进制数据,另一方面,您在这里清楚地向我们显示了一个由base64编码产生的字符串(正如您可以从最后的“=”推断的那样)


你混淆了一些东西。

托什,你说你首先对数据进行base64编码,然后在将数据存储到数据库之前压缩数据。到目前为止还不错。压缩数据后,它是二进制数据。因此,我假设您已将此数据以二进制格式存储在数据库中。现在给我们看一个字符串:

示例字符串如下:“Enrj4mzkrshgwdhbx1mumjfnoschiacuhbci=”

根据您的说法,这表示压缩的数据。现在,有一个矛盾。一方面,压缩的数据是二进制数据,另一方面,您在这里清楚地向我们显示了一个由base64编码产生的字符串(正如您可以从最后的“=”推断的那样)


你混淆了一些东西。

如果字符串先是base64,然后是zipped,那么解码它应该是另一种方式

您的示例和输出字符串不匹配

In [1]: t = '{"xp": 656398, "rank": 34}'

In [2]: t.encode('base64')
Out[2]: 'eyJ4cCI6IDY1NjM5OCwgInJhbmsiOiAzNH0=\n'

In [3]: t.encode('zlib').encode('base64')
Out[3]: 'eJyrVqooULJSMDM1M7a00FFQKkrMywbyjU1qAVupBsE=\n'

In [4]: t.encode('base64').encode('zlib')
Out[4]: 'x\x9cK\xad\xf42Iv\xf64\xf3t\x894\xf4\xcb\xf25\xf5w.O\xf7\xcc\xf3\xcaH\xca-\xce\xf4\xcft\xac\xf2\xf30\xb0\xe5\x02\x00\xe3E\x0b\xd7'
给定的输入字符串“{“xp”:656398,“rank”:34}”不生成示例输出(请参见Out[3]和Out[4])

您还应该注意,在这种情况下,
base64
编码字符串比原始字符串长,并且附加的
zlib
编码最长。压缩这么短的字符串通常不值得花费这么多开销

如果我们以您的输出为例并对其进行处理,这就是我们得到的结果

In [5]: s = 'eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI='

In [6]: s.decode('base64')
Out[6]: 'x\xda\xe3\xe2fd\xad(`Y\xd1\xc1\xc7Y\x94\x98\x97\xcd\xa2\xc4\x08\x00%!\x04"'

In [7]: s.decode('base64').decode('zlib')
Out[7]: '\n\x0b\x01\x05xp\x04\xa8\x88\x0e\trank\x04"\x01'
您可以清楚地看到输出中的文本“xp”和“rank”。结尾处的“.”可以解释为整数34


似乎您的actionscript在编码和压缩数据之前对数据进行了一些处理。

如果字符串先进行了base64编码,然后进行了压缩,那么解码应该是另一种方式

您的示例和输出字符串不匹配

In [1]: t = '{"xp": 656398, "rank": 34}'

In [2]: t.encode('base64')
Out[2]: 'eyJ4cCI6IDY1NjM5OCwgInJhbmsiOiAzNH0=\n'

In [3]: t.encode('zlib').encode('base64')
Out[3]: 'eJyrVqooULJSMDM1M7a00FFQKkrMywbyjU1qAVupBsE=\n'

In [4]: t.encode('base64').encode('zlib')
Out[4]: 'x\x9cK\xad\xf42Iv\xf64\xf3t\x894\xf4\xcb\xf25\xf5w.O\xf7\xcc\xf3\xcaH\xca-\xce\xf4\xcft\xac\xf2\xf30\xb0\xe5\x02\x00\xe3E\x0b\xd7'
给定的输入字符串“{“xp”:656398,“rank”:34}”不生成示例输出(请参见Out[3]和Out[4])

您还应该注意,在这种情况下,
base64
编码字符串比原始字符串长,并且附加的
zlib
编码最长。压缩如此短的字符串通常不值得花费额外的开销

如果我们以您的输出为例并对其进行处理,这就是我们得到的结果

In [5]: s = 'eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI='

In [6]: s.decode('base64')
Out[6]: 'x\xda\xe3\xe2fd\xad(`Y\xd1\xc1\xc7Y\x94\x98\x97\xcd\xa2\xc4\x08\x00%!\x04"'

In [7]: s.decode('base64').decode('zlib')
Out[7]: '\n\x0b\x01\x05xp\x04\xa8\x88\x0e\trank\x04"\x01'
您可以清楚地看到输出中的文本“xp”和“rank”。靠近末尾的“.”可以解释为整数34


似乎您的actionscript在编码和压缩数据之前对数据进行了一些破坏。

Flash可能会破坏这些数据,但您应该分享actionscript中创建和检查这些数据的示例

如果您使用的是第三方库,那么它可能使用了Python所期望的其他字符集

如果您使用的是官方库,那么Actionscript实现UTF8和ascii的方式似乎有所不同。(这里有不同的方法-)

只需查看actionscript并记录库或代码是否存在问题,比尝试反向工程要容易得多

我认为也值得尝试反向修正这个错误

import base64
import zlib

flash =  "eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI="

original = '{"xp": 656398, "rank": 34}'
encoded = original.encode('zlib').encode('base64')
decoded = encoded.decode('base64').decode('zlib')
print original
print encoded
print decoded
我能问你为什么要这么做吗

1-除非你的数据包大得多,否则你不会节省很多带宽。事实上,对小有效载荷的压缩实际上可以增加大小


2-假设这是基于web的,您应该能够让服务器动态执行此操作。

Flash可能会破坏此功能,但您应该分享Actionscript中创建和检查此数据的示例

如果您使用的是第三方库,那么它可能使用了Python所期望的其他字符集

如果您使用的是官方库,那么Actionscript实现UTF8和ascii的方式似乎有所不同。(这里有不同的方法-)

只需查看actionscript并记录库或代码是否存在问题,比尝试反向工程要容易得多

我认为也值得尝试反向修正这个错误

import base64
import zlib

flash =  "eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI="

original = '{"xp": 656398, "rank": 34}'
encoded = original.encode('zlib').encode('base64')
decoded = encoded.decode('base64').decode('zlib')
print original
print encoded
print decoded
我能问你为什么要这么做吗

1-除非你的数据包大得多,否则你不会节省很多带宽。事实上,对小有效载荷的压缩实际上可以增加大小

二,-