2017-05-12 39 views
0

16進データと非16進データの両方を含むファイルがあります。例えば が、私は直接のpythonコンソールで、このコードを貼り付けvar _0x36ba=["\x69\x73\x41\x72\x72\x61\x79","\x63\x61\x6C\x6C","\x74\x6F\x53\x74\x72\x69\x6E\x67",]ファイルからの16進数の読み取り(Python)

、私は

var _0x36ba=["isArray","call","toString",]を得た。しかし、私は、ファイルや印刷内容を読み取るしようとすると、それは私にvar _0x36ba=["\\x69\\x73\\x41\\x72\\x72\\x61\\x79","\\x63\\x61\\x6C\\x6C","\\x74\\x6F\\x53\\x74\\x72\\x69\\x6E\\x67","\\

を与えるには、バックスラッシュのように思えるです彼らのように解析されます。

ファイルを読み取り、読み取り可能な出力を得るにはどうすればよいですか?

+0

あなたが望むものを考えてください。あなたは、* 16進シーケンスを解釈したいと思いますか? e。 '\ xnn'のすべての出現箇所は' n'は16進数字ですか?クイック正規表現置換を使用して(またはおそらくこれを行うライブラリを使用して)行うことができます。 – Alfe

+0

はい、すべての\ xnnを読み取り可能にする必要があります。これどうやってするの?ファイルから読み込んだ後、 '\\'は別のシンボルになります。 –

+0

binascii.unhexlifyを使用すると、stdlibの 'binascii'ライブラリ – OmerBA

答えて

1

編集:Martijnのソリューションを使用してください。私はまだtext.decode('string_escape')を知らなかったし、もちろんそれはもっと速い。以下は私の元の答えに従います。あなたが入力は、おそらくに解釈されるべきであるx(例えばfoo bar \\x41 blohに続く二重のバックスラッシュが含まれないことがわかっている場合は

def unescape(text): 
    return re.sub(r'\\\\|\\x([0-9a-fA-F]{2})', 
     lambda m: chr(int(m.group(1), 16)) if m.group(1) 
        else '\\', text) 

使用すると、すべてをエスケープ解除するには、この正規表現は、文字列内の進表現のエスケープ

def unescape(text): 
    return re.sub(r'\\x([0-9a-fA-F]{2})', 
     lambda m: chr(int(m.group(1), 16)), text) 
+0

組み込みのコーデックを使ってエスケープ構文をデコードするだけでは、これは本当に遅いオプションです。 –

+0

絶対に正しい、Martijn。私はまだ '.decode( 'string_escape')を認識していませんでした。しかし、私は答えるのに数分ほど早かった。多くの非常に長い文字列をデコードする必要があります。 – Alfe

+1

通勤中に応答する価格。残念ながら、私たちはこの解決策でOPを手助けするだけですか? ;-) –

2

あなたはで文字列リテラルを持っている:代わりに)foo bar \A blohへのfoo bar \x41 bloh、あなたはこれを簡素化することができます210ヘクスエスケープ。あなたはstring_escapeエンコーディングでこれらをデコードすることができます

string_escape
Produce a string that is suitable as string literal in Python source code

デコードそのエンコーディングを反転:

>>> "\\x69\\x73\\x41\\x72\\x72\\x61\\x79".decode('string_escape') 
'isArray' 
>>> "\\x63\\x61\\x6C\\x6C".decode('string_escape') 
'call' 
>>> "\\x74\\x6F\\x53\\x74\\x72\\x69\\x6E\\x67".decode('string_escape') 
'toString' 
ビルトインされているコーデック

text.decode('string_escape') 

codecsモジュールのドキュメントのPython Specific Encodings sectionを参照してください。これは正規表現を使用するよりもはるかに高速です:

>>> from timeit import timeit 
>>> import re 
>>> def unescape(text): 
...  return re.sub(r'\\x([0-9a-fA-F]{2})', 
...   lambda m: chr(int(m.group(1), 16)), text) 
... 
>>> value = "\\x69\\x73\\x41\\x72\\x72\\x61\\x79" 
>>> timeit('unescape(value)', 'from __main__ import unescape, value') 
6.254786968231201 
>>> timeit('value.decode("string_escape")', 'from __main__ import value') 
0.43862390518188477 

これは約14倍高速です。

関連する問題