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



我有一个字符串保存到一个数据库中,该数据库由Actionscript通过base64对其进行编码,然后用zlib对其进行压缩。

示例字符串如下:"eNrj4mZkrShgWdHBx1mUmJfNosQIAUhBCI="

如果我通过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对其进行压缩和base64处理。看起来这就是生成额外头/损坏数据信息的原因。

如果字符串先是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]: 'xx9cKxadxf42Ivxf64xf3tx894xf4xcbxf25xf5w.Oxf7xccxf3xcaHxca-xcexf4xcftxacxf2xf30xb0xe5x02x00xe3Ex0bxd7'

给定的输入字符串"{"xp":656398,"rank":34}"不会产生示例输出(请参阅Out[3]和Out[4])。

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

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

In [5]: s = 'eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI='
In [6]: s.decode('base64')
Out[6]: 'xxdaxe3xe2fdxad(`Yxd1xc1xc7Yx94x98x97xcdxa2xc4x08x00%!x04"'
In [7]: s.decode('base64').decode('zlib')
Out[7]: 'nx0bx01x05xpx04xa8x88x0etrankx04"x01'

您可以在输出中清楚地看到文本"xp"one_answers"rank"。靠近末尾的"可以被解释为整数34。

在对数据进行编码和压缩之前,您的操作脚本似乎对数据进行了一些篡改。

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的,您应该能够让服务器在运行中执行此操作。

对我来说,Python脚本的解码顺序似乎不对。如果你说的编码顺序是正确的,首先是base64,然后是zlib,你必须按照相反的顺序解码:

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

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

示例字符串如下:"eNrj4mZkrShgWdHBx1mUmJfNosQIAUhBCI="

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

你混淆了什么。

最新更新