2017-05-12 1 views
0

16 진수 데이터와 16 진수가 아닌 데이터가 모두 포함 된 파일이 있습니다. 예를 들어 , 내가 직접 파이썬 콘솔에서이 코드를 붙여 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 진수 시퀀스를 인터폴레이션 *할까요? 이자형. '\ xnn'의 모든 어구는'n'은 16 진수입니까? 그 coul은 영리한 regexp 대체를 사용하여 이루어질 수 있습니다. – 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')를 알지 못했다. 그러나 나는 대답하는 데 몇 분 빠르다. Andrew는 느린 해결책을 사용하여 매우 긴 문자열을 많이 해독하여 이러한 분실 시간을 요약해야합니다. – Alfe

+1

통근 중에 응답하는 가격입니다. 안타깝게도 우리는이 해결책으로 OP를 도울뿐입니다. ;-) –

2

당신은와 문자열 리터럴이 있습니다 대신) foo bar \A blohfoo bar \x41 bloh, 당신은이를 단순화 할 수 있습니다210 hex hex 이스케이프.

text.decode('string_escape') 

codecs 모듈 문서의 Python Specific Encodings section 참조 : 당신은 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' 

인을 내장 코덱 정규 표현식을 사용하는 것보다 훨씬 빠릅니다.

>>> 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 배 빠릅니다.