문자열에 유니 코드 코드 포인트와 16 진수 값을 혼합하여 사용하는 것처럼 보이는 이진 파일을 어떻게 구문 분석 할 수 있습니까?

트 랄프 3

텍스트가 포함 된 바이너리 파일이 있습니다. 문자열의 16 진수 바이트를 가져 와서 읽을 수있는 텍스트로 변환해야합니다. 저는 Python 3을 사용하고 있습니다.

인코딩은 UTF-8로 보이지만 특정 문자열을 디코딩하는 데 문제가 있습니다. 일부 문자열에는 문자를 나타내는 유니 코드 코드 포인트가있는 것처럼 보이지만 다른 문자열은 UTF-8 문자 테이블의 항목에 해당하는 16 진수 값을 사용합니다. 예를 들면 다음과 같습니다.

4D 6F 6A 65 20 53 70 6F 72 65 20 76 FD 74 76 6F 72 79 -> Moje Spore výtvory

FD해당 문자열 바이트는 ý문자를 나타내지 만 FD는 다음과 같이 문자 테이블에서 유니 코드 코드 포인트를 확인하는 경우에만이 문자에 해당합니다.

여기에 이미지 설명 입력

이 문자를 16 진수로 나타내려면 2 바이트가 필요합니다. 모든 문자열이 이와 같이 작동하면 문제가되지 않지만 일부는 실제로 16 진수 값을 사용하여 여기에 표시된대로 문자를 나타냅니다.

4C 45 47 4F C2 AE -> LEGO®

이 예에서 2 바이트 C2 AE®문자를 나타냅니다 . 그러나 이것은 여기에 표시된 유니 코드 코드 포인트가 아니라 16 진수 표현입니다.

여기에 이미지 설명 입력

이제 여기에 문제가 있습니다. 문자열이 언제 유니 코드 코드 포인트를 사용하는지, 언제 16 진수 값을 사용하는지 알 수있는 방법이 없으며 완벽하게 구문 분석해야합니다. 왜 이것이 사실 일 수 있는지에 대한 아이디어가 있습니까? UTF-8로 이것을 디코딩하려고하면 파이썬이 충돌합니다.. 같은 값에 도달하면 FD무엇을해야할지 모르기 때문입니다. ord()chr()함수를 사용하여 바이트 단위로 디코딩하려고 시도했지만 충돌을 방지하는 동안 멀티 바이트 문자가 속하지 않는 추가 항목을 갖게됩니다 (예 : LEGO 예제는 다음과 같습니다 :) LEGO®. 데이터는 체크섬을 생성하는 데 사용되어야하기 때문에 완벽하게 구문 분석되어야하므로 보이지 않는 항목도 결과를 변경할 수 있습니다. 감사.

마크 톨로 넨

첫 번째 문자열 (FD 포함)은 UTF-8로 인코딩 되지 않습니다 . ISO-8859-1 또는 Windows-1252 일 가능성이 높습니다. 나타내는 바이트는 ý유니 코드 코드 포인트 값과 일치하지만 "[U] nicode 코드 포인트를 사용하여 문자를 표시"하지 않습니다.

LEGO 문자열은 UTF-8로 인코딩됩니다. 파일에서 문자열을 해킹하고 사양이없는 경우 추측 만하면됩니다. UTF-8은 멀티 바이트 인코딩에 대한 특정 규칙을 따라야하므로 UTF-8을 먼저 시도하고 UTF-8이 아닌 경우 디코딩이 실패 할 수 있습니다. 그런 다음 ISO-8859-1. 후자는 인코딩이 아니더라도 모든 것을 디코딩합니다. 쓰레기로 끝날 수 있습니다.

UTF-8 인코딩의 예 :

>>> s='Moje Spore výtvory'.encode('utf8')
>>> s
b'Moje Spore v\xc3\xbdtvory'
>>> s.hex()
'4d6f6a652053706f72652076c3bd74766f7279'
>>> s.decode('utf8')
'Moje Spore výtvory'
>>> s.decode('iso-8859-1')  # note it works, but garbage
'Moje Spore výtvory'

문자열이 ISO-8859-1로 인코딩 된 경우 :

>>> s='Moje Spore výtvory'.encode('latin1') # an alias for ISO-8859-1
>>> s.hex()
'4d6f6a652053706f72652076fd74766f7279'
>>> s.decode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 12: invalid start byte
>>> s.decode('latin1')
'Moje Spore výtvory'

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관