1

我有一个字符串保存到由 Actionscript 通过 base64 编码然后 zlib 压缩它的数据库。

示例字符串如下:“eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI="

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

4

4 回答 4

1

如果字符串首先是base64-ed然后被压缩,解码它应该是相反的!

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

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”和“等级”。接近结尾的'"'可以解释为整数34。

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

于 2012-09-11T19:20:53.783 回答
0

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

print s.decode("zlib").decode("base64")
于 2012-09-11T18:48:50.633 回答
0

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

示例字符串如下:“eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI="

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

你混淆了一些东西。

于 2012-09-11T18:56:24.957 回答
0

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

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

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

如果库或您的代码存在问题,则仅查看操作脚本并注意要容易得多,而不是尝试对其进行逆向工程。

我认为它也可能值得尝试反向修复这个错误......

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-假设这是基于网络的,您应该能够让服务器即时执行此操作。

于 2012-09-11T19:28:49.390 回答