1

私はそれをbase64し、次にそれをzlib圧縮することにより、Actionscriptによってエンコードされたデータベースに保存された文字列を持っています。

文字列の例は次のとおりです。"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で圧縮されてから圧縮されている場合、デコードは逆になります。

例と出力文字列が一致しません。

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として解釈できます。

アクションスクリプトは、データをエンコードおよび圧縮する前に、データをある程度操作しているようです。

于 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="

あなたによると、これは圧縮されたデータを表しています。今、矛盾があります。一方では、zip形式のデータはバイナリデータですが、他方では、base64エンコードの結果である文字列をここに明確に示しています(最後に「=」から推測できます)。

あなたは何かを混乱させます。

于 2012-09-11T18:56:24.957 に答える
0

Flashがこれを巧みに操っている可能性がありますが、このデータを作成およびチェックするActionscriptの例を共有する必要があります。

サードパーティのライブラリを使用している場合は、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-これがWebベースであると仮定すると、サーバーにその場でこれを実行させることができるはずです。

于 2012-09-11T19:28:49.390 に答える