2017-04-02 1 views
1

から私はunluacとLUAファイルを逆コンパイルし、それはすべての文字列変数が読めるものではなく、代わりに私がデコード行くにはどうすればよいascii encodedデコードASCII文字列値をリバースエンジニアリングのluaファイル

clues = { 
    { 
    answer = { 
     "\216\173", 
     "\216\177", 
     "\216\168", 
     "\216\167", 
     "\216\161" 
    }, 
    text = "\216\173\217\138\217\136\216\167\217\134\032\216\178\216\167\216\173\217\129\032\217\138\216\186\217\138\216\177\032\217\132\217\136\217\134\032\216\172\217\132\216\175\217\135", 
    syllables = { 
     {"\216\173", "\216\177"}, 
     {"\216\168", "\216\167"}, 
     {"\216\161"} 
    } 

です判明Pythonまたはjavaのファイル全体ignoring any non ascii characters

+0

各スラッシュに文字列を分割し、個々の数値文字列をintに変換してからcharに変換することもできます。その時点で値が127以下であるかどうかをチェックして非アスキー文字をフィルタリングすることができます。 – Wietlol

+0

'ascii-encoded'とはどういう意味ですか? ASCIIコード化されていないデータをASCIIコード化されたデータに含めることはできませんので、ASCIIコード化された*と*に非ASCII文字を含めて無視する必要があります。 *エスケープシーケンス*をおそらくデコードする必要があるのでしょうか? –

+0

以下の私の答えによると、あなたはアラビア語のテキストを持っているASCII互換のデータを持っていません。 ASCII以外のデータをすべて削除しますか?あなたは一杯で空の弦で終わるだろう。非ASCIIデータを削除しなければならない場合のテクニックについては、以下の私の答えを参照し、[非ASCII文字を単一のスペースで置き換える](// stackoverflow.com/q/20078816)を参照してください。 –

答えて

2

あなたは小数を使用して3桁のエスケープシーケンスにエンコードされた各バイトで、UTF-8エンコードされたデータない ASCIIを持っています。実際のテキストは、主にアラビア語の文章で構成されています。

\dddシーケンスを対応するバイト値に置き換え、次にUTF-8としてデコードする必要があります。 Pythonの3では:

utf8_data = bytes([int(data[i + 1:i + 4]) for i in range(0, len(data), 4)]) 
print(utf8_data.decode('utf8')) 

デモ:

>>> data = r"\216\173\217\138\217\136\216\167\217\134\032\216\178\216\167\216\173\217\129\032\217\138\216\186\217\138\216\177\032\217\132\217\136\217\134\032\216\172\217\132\216\175\217\135" 
>>> utf8_data = bytes([int(data[i + 1:i + 4]) for i in range(0, len(data), 4)]) 
>>> print(utf8_data.decode('utf8')) 
حيوان زاحف يغير لون جلده 

Google翻訳これは不気味な動物は英語でその皮膚の色を変更しである私に語りました。

私たちは、そうでない場合は、スタックベースのパーサ使用してJSONにLuaの構文を変換することができます。最後に2つの追加}文字で

import re 
import json 

def lua_to_python(lua_data): 
    return json.loads(''.join(_convert_lua_to_json_chunks(lua_data))) 

def _lua_bytes_to_text(data): 
    return bytes(
     [int(data[i + 1:i + 4]) for i in range(0, len(data), 4)] 
    ).decode('utf8') 

def _convert_lua_to_json_chunks(lua_data): 
    tokens = re.split(br'(["{},])', lua_data) 
    stack = [] 
    pos_tokens = enumerate(tokens) 
    for pos, token in pos_tokens: 
     if b'=' in token: 
      if not stack: 
       # top-level key-value, produce JSON object syntax 
       stack.append('}') 
       yield '{' 
      yield '"{}":'.format(token.strip().rstrip(b' =').decode('utf8')) 
     elif token == b'{': 
      # array or object? 
      next_nonws = next(t for t in tokens[pos + 1:] if t.strip()) 
      if b'=' in next_nonws: 
       stack.append('}') 
       yield '{' 
      else: 
       stack.append(']') 
       yield '[' 
     elif token == b'}': 
      yield stack.pop() 
     elif token == b'"': 
      yield '"' 
      for pos, s in pos_tokens: 
       if s == b'"': 
        yield '"' 
        break 
       yield _lua_bytes_to_text(s) 
     else: 
      yield token.decode('utf8') 
    yield from stack 

を、あなたのデータは生成:

>>> lua_to_python(lua_data) 
{'clues': [{'answer': ['ح', 'ر', 'ب', 'ا', 'ء'], 'text': 'حيوان زاحف يغير لون جلده', 'syllables': [['ح', 'ر'], ['ب', 'ا'], ['ء']]}]} 
>>> pprint(lua_to_python(lua_data)) 
{'clues': [{'answer': ['ح', 'ر', 'ب', 'ا', 'ء'], 
      'syllables': [['ح', 'ر'], ['ب', 'ا'], ['ء']], 
      'text': 'حيوان زاحف يغير لون جلده'}]} 

これがすべきデータをさらに処理するためのオプションが豊富に用意されています。

1

これを試してみてください:

import re 

data = '\\216\\173\\217\\138\\217\\136\\216\\167\\217\\134\\032\\216\\178\\216\\167\\216\\173\\217\\129\\032\\217\\138\\216\\186\\217\\138\\216\\177\\032\\217\\132\\217\\136\\217\\134\\032\\216\\172\\217\\132\\216\\175\\217\\135' 
decoded_data = re.sub('\\\\(\d{1,3})', lambda x: chr(int(x.group(1))), data).decode('utf-8') 

print(repr(decoded_data)) 
+0

私はそのように考えましたが、質問で\ 168を見つけました。 '8'は8進数ではないので、これは10進数だと思います。 – hallazzang

+0

うん、私は私のコメントをしたときに私の計算の数字が足りないことを知っていました。 –

+0

この時点では、これは不器用な出力のように見えます(バイナリデータではなく、実際の* text *を保持する 'text = '..''と仮定した場合)。 –