2012-09-11 48 views
1

我有一个字符串保存到一个数据库中,该数据库由Actionscript通过base64ing进行编码,然后zlib将其压缩。在python中从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是没有强大到足以击败这个:)任何帮助将不胜感激!

编辑:动作脚本首先需要一个AS对象,并将其转换为ByteArray,之后zlib将其压缩并base64ing它。它看起来像是生成额外的头/损坏的数据信息。

+2

请再想一想,告诉我们100%的确定性:按照何种顺序执行编码?先是拉链,然后是b64运输,或者反过来呢? –

回答

0

闪存可以重整这一点,但你应该如果您使用的是第三方库共享

从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-除非你的数据包更大,否则你不会节省很多带宽。实际上,对小型有效载荷的压缩实际上可以增加尺寸。假设这是基于网络的,你应该可以让服务器在运行中执行此操作。

+0

是的,我很确定Flash/actionscript是通过添加一些额外的字符来改变这一点,正如我原先所说的。我会尝试找到用于编码和发布的精确的Actionscript代码。 – Tosh

+0

为了回答你的问题,是的,我们的大部分数据包都大得多。这是我能找到的最小的例子,但大多数未压缩的数据包的大小是几百kb。对于2,我们有数百万行数据存档,我们要转换到一个新的系统,所以没有实时系统来运行它。我可以构建一个AS查询器,查询数据库中的字符串,读取它们,然后重写,但我真的希望用python来做这个服务器端。 – Tosh

+0

了解档案 - 是的,这将是非常快速的蟒蛇。我担心如果不使用闪存代码,试图弄清楚发生了什么,会有很多痛苦。 flash可以使用不同的有效载荷,或者填充有效载荷,或者可以编码字符串的某种不同表示。 希望你可以找到闪光灯,因为我真的想知道发生了什么事。 (如果你有.swf,我们也可以反编译它...) –

0

对我来说,它看起来像你的Python脚本以错误的顺序解码。如果你说的编码顺序什么是正确的,首先的base64,然后zlib,则必须以相反的顺序进行解码:

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

它不能; base64然后zlib的结果是不是文字:) – hobbs

+0

@Tosh说,他第一次b64编码,然后拉链两次。这是有道理的。 –

+0

那么,试图解压缩然后base64解码示例数据只会给出一个错误,因为它显然不zlib压缩。 – hobbs

0

托什,你说,你第一次的base64编码数据,然后将其存储之前压缩它到数据库。迄今为止这很好。压缩数据后,它是二进制数据。因此,我假设你已经将这些数据以二进制格式存储在数据库中。现在你告诉我们,一个字符串:

的示例串是这样的:“eNrj4mZkrShgWdHBx1mUmJfNosQIACUhBCI =”

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

你混淆了一些东西。

+0

它存储在mysql数据库的MEDIUMTEXT字段中。 unzip和unbase64顺序是正确的,我相信actionscript不使用标准编码,并在zip头中留下了额外的东西。 – Tosh

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, “等级”:34}' 不产生输出示例(参见缺货[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

看来你的动作做一些数据的mangling编码和压缩它。