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

2024-06-16 11:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我将一个字符串保存到一个数据库中,该数据库由Actionscript编码,方法是以64为基数,然后对其进行zlib压缩。

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

如果我通过Actionscript解压并取消base64,我会得到我想要的:

{“xp”:656398,“rank”:34}

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

到目前为止,在Python中我已经尝试过:

import base64
import zlib

s = 'eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI='

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

看起来Actionscript在头中添加了一些额外的位,但是我的Python不够强大,无法击败这个:)任何帮助都将非常感谢!

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


Tags: 方法字符串import数据库示例编码解决方案xp
3条回答

如果字符串先是base64 ed,然后是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似乎会对数据进行一些处理。

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

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

Flash可能会破坏这一点,但您应该共享Actionscript中的一个示例,该示例创建并检查这些数据。

如果您使用的是第三方库,则它可能使用了Python所期望的替代字符集。

如果您使用的是官方库,那么Actionscript实现UTF8和ascii的方式似乎不同。(这里有不同的方法-http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/Base64Encoder.html

只需查看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的,您应该能够让服务器动态地执行此操作。

相关问题 更多 >