1

Android の resources.arsc を解析するための基本的な Python プログラムを作成しました。ファイルで見つかったすべての文字列を出力します。文字列には、各文字の間にゼロ値のバイトがあります。これは、文字列が utf-16 で保存されていることを示唆しています。それが正しいかどうかはわかりませんが、Android の文字列はローカライズできるので、そうだと思います。string.decode('hex') を使用して、文字列を人間が読める形式で出力しています。文字列を構成するバイトのリストを含むサンプルを次に示します。

>>> print ''.join(['00', '72', '00', '65', '00', '73', '00', '2f', '00', '64', '00', '72',    '00', '61', '00', '77', '00', '61', '00', '62', '00', '6c', '00', '65', '00', '2f', '00', '61', '00', '62', '00', '6f', '00', '75', '00', '74', '00', '2e', '00', '70', '00', '6e', '00', '67', '00', '00', '00']).decode('hex')
res/drawable/about.png

問題は、このプログラムを grep にパイプすると、読み取った文字列を grep できないことです。grepが出力で一致できるように、シェルに出力するにはどうすればよいですか? ありがとう!

(編集)実際に文字列を印刷しましたが、私の例では、「印刷」されたバージョンと返されたバージョンの両方を表示する方がよいと考えました。混乱させて申し訳ありません。この例では、grep できないのは「/res/drawable/about.png」です。

(EDIT2) 簡単なデモ:

11:33 AM ~/learning_python $ python -c "print ''.join(['00', '72', '00', '65', '00', '73', '00', '2f', '00', '64', '00', '72',    '00', '61', '00', '77', '00', '61', '00', '62', '00', '6c', '00', '65', '00', '2f', '00', '61', '00', '62', '00', '6f', '00', '75', '00', '74', '00', '2e', '00', '70', '00', '6e', '00', '67', '00', '00', '00']).decode('hex')"
res/drawable/about.png
11:33 AM ~/learning_python $ python -c "print ''.join(['00', '72', '00', '65', '00', '73', '00', '2f', '00', '64', '00', '72',    '00', '61', '00', '77', '00', '61', '00', '62', '00', '6c', '00', '65', '00', '2f', '00', '61', '00', '62', '00', '6f', '00', '75', '00', '74', '00', '2e', '00', '70', '00', '6e', '00', '67', '00', '00', '00']).decode('hex')" | grep about
11:33 AM ~/learning_python $ 

(EDIT3)別のデモ、これはデータがutf-16-beであることを証明していると思います:

11:33 AM ~/learning_python $ python -c "print ''.join(['00', '72', '00', '65', '00', '73', '00', '2f', '00', '64', '00', '72',    '00', '61', '00', '77', '00', '61', '00', '62', '00', '6c', '00', '65', '00', '2f', '00', '61', '00', '62', '00', '6f', '00', '75', '00', '74', '00', '2e', '00', '70', '00', '6e', '00', '67', '00', '00', '00']).decode('hex')" > testfile
11:35 AM ~/learning_python $ iconv -f utf16be -t utf8 testfile
res/drawable/about.png
11:35 AM ~/learning_python $ iconv -f utf16be -t utf8 testfile | grep about
Binary file (standard input) matches
11:35 AM ~/learning_python $ iconv -f utf16be -t utf8 testfile | grep -a about
res/drawable/about.png
4

2 に答える 2

2

文字をデコードします。

'\x00r\x00e\x00s'.decode('utf-16-be') # produces u'res'

次に、デコードされた文字列を出力できます。

$ python -c "print ''.join(['00', '72', '00', '65', '00', '73', '00', '2f', '00', '64', '00', '72',    '00', '61', '00', '77', '00', '61', '00', '62', '00', '6c', '00', '65', '00', '2f', '00', '61', '00', '62', '00', '6f', '00', '75', '00', '74', '00', '2e', '00', '70', '00', '6e', '00', '67', '00', '00', '00', '00']).decode('hex').decode('utf-16-be').rstrip('\0')" | grep about
res/drawable/about.png
于 2012-10-18T17:14:32.720 に答える