최근 바이너리 데이터를 파이썬으로 구문 분석하는 활동을 시작했지만 "바이트"항목이 파이썬으로 처리되는 방식에 혼란 스럽습니다. 예 : 다음 통역자 대화 :파이썬의 바이트에 대해 혼동을 느낀다
>>> f = open('somefile.gz', 'rb')
>>> f
<open file 'textfile.gz', mode 'rb' at 0xb77f4d88>
>>> bytes = f.read()
>>> bytes[0]
'\x1f'
>>> len(bytes[0])
1
>>> int(bytes[0]) <---- calling __str__ automatically on bytes[0] ?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '\x1f'
상기 세션 [0]은 1 바이트의 크기를 갖지만 바이트 __str__
진수 표현은 하나라는 것을 나타낸다. 걱정할 필요는 없지만 바이트 [0]을 단일 바이트로 처리하려고하면 펑키 한 동작이 발생합니다.
사양에 16 진수, 2 진수 및 10 진수 표현이 포함 된 일부 사양을 기반으로 이진 스트림을 구문 분석하거나 해석하려면 어떻게해야합니까?
예 : "처음 두 바이트는 \xbeef
, 그 다음은 십진수 8
이고 그 뒤에 8 비트의 각 비트가 플래그를 나타내는 팩형 비트 필드가 오는가?이 작업을 쉽게 수행 할 수있는 몇 가지 모듈이 있지만 '처음부터 그렇게 할 거라고.
을 내가하지만 struct
모듈에 대한 참조를 보았다 바이트가 새 모듈을 도입하지 않고 직접 읽을 확인하는 방법은 같은? 뭔가가없는 bytes[0] == 0xbeef
누군가가 나를 도와 주시겠습니까? 파이썬을 사용하여 스펙을 따르는 바이너리 데이터를 어떻게 파싱 하는가? 감사.
"새 모듈 소개"에 대해 걱정하지 마십시오. Python 표준 라이브러리의 많은 모듈에는 핵심 기능이 포함되어 있습니다. 핵심 기능은 단순히 자체의 네임 스페이스로 분리되지만 언어의 필수 부분입니다. 대부분의 모듈은 인터프리터로 컴파일됩니다 (적어도 CPython을 사용할 때). –