2017-05-12 2 views
0

struct.unpack을 사용하여 모든 C 구조체 필드와 그 값 (정수 및 문자열)의 덤프로 만든 이진 파일을 읽습니다. 그런 다음 압축을 푼 튜플을 사용하여 나중에 텍스트 파일 출력에 기록되는 필드 및 해당 값의 중간 사전 표현을 만듭니다.Python struct.unpack - 이진 문자열 리터럴을 아스키 텍스트로 파일 변환하기

텍스트 파일 출력 디스플레이 아래 문자열 : 프로그램이 이전이 잘 작동하는데 사용 파이썬 2.6에 기입 된

ID = b'000194901137\x00\x00\x00\x00' 
timestampGMT = 1489215906 
timezoneDiff = -5 
timestampPackage = 1489215902 
version = 293 
type = b'FULL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 

. 텍스트 파일에 쓰는 동안 우리는 원치 않는 진수 문자를 제거하려면 아래의 람다 식을 사용했다 : 파이썬 3.5로 이동

filtered_string = filter(lambda x: x in string.printable, line) 

지금 필터를 반환하기 때문에, 람다 표현식이 더 이상 지원되지 않는 문자열로 쉽게 변환 할 수 없습니다.

이진 문자열 리터럴을 ASCII 문자로 변환하는 Python 방식은 무엇입니까 (후행 NUL '\ x00'없음). 따라서 일반 문자열 값으로 작성됩니다.

또한 각 파일에 대해 처리 할 항목이 여러 천개 (여러 파일이 있음)이므로 현재 상황에서 가능한 최상의 솔루션을 찾고 있습니다.

+0

읽기 것은 당신이 상대하고있는 널링인가 - 예 : 것'type.rstrip (B ' \ x00 ')'작업 이냐 아니면 인쇄 가능한 체크가 필요한가 ... 나중에'바이트 '가 아닌'str'을 원한다면 알 수 없으므로' '.join (ch.isprintable() 인 경우 text.decode ('ascii ')의 ch)'내 생각 엔 ... –

+0

유일한 NULL입니다. 전체 문자열을 인쇄하려고 시도하기 때문에 후행 NULL도 인쇄합니다. rstrip()을 시도했지만 캐리지 리턴 문자도 제거합니다. – prohit99

+0

위에서 썼던대로 rstrip으로 스트립하고 싶은 것을 건네 주면됩니다 :'type.rstrip (b '\ x00')' –

답변

0

파이썬 2에서는 텍스트와 이진 데이터 모두에 str 유형을 사용할 수 있으며 정상적으로 작동합니다. 바이너리 파일로 인코딩 2.

$ python3 
Python 3.5.0 (default, Sep 15 2015, 13:42:03) 
[GCC 4.6.3] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> type(b'aaa') 
<class 'bytes'> 
>>> type(b'aaa').__mro__ 
(<class 'bytes'>, <class 'object'>) 
>>> type('aaa') 
<class 'str'> 
>>> type('aaa').__mro__ 
(<class 'str'>, <class 'object'>) 

$ python 
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> type(b'aaa').__mro__ 
(<type 'str'>, <type 'basestring'>, <type 'object'>) 
>>> type('aaa').__mro__ 
(<type 'str'>, <type 'basestring'>, <type 'object'>) 

문자열이 필요 bytes 타입의 문자열 리터럴로 읽어 Python3 이진 데이터 읽기에서 유형 bytes의 이며, 파이썬으로 공통 기본 클래스를 공유하지 않습니다 str (유니 코드) 유형으로 변환되어 일반 문자열로 파일에 표시되거나 쓰여집니다. 내가 struct.unpack()에서 튜플을 검색 한 후

, 나는 다음을 수행하십시오

valTuple = struct.unpack(fmt, self.data[off : goff + struct_size]) 

    valList = list(valTuple) 
    for i in range(len(valList)): 
    if type(valList[i]) == bytes: 
     valList[i] = valList[i].rstrip(b'\x00').decode() 

https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data