파이썬으로 바이너리 파일을 읽고 있는데 파일 형식에 대한 설명서는 다음과 같습니다.
플래그 (바이너리) 의미
1 nnn nnnn 뒤에 데이터 바이트가 하나 있음을 나타냅니다. that is to be duplicated nnn nnnn (127 maximum) 타임스.
0 nnn nnnn nnn nnnn 바이트의 이미지가 있음을 나타냅니다. data to follow (127 bytes maximum) and that 중복이 없습니다.
n 000 0000 줄 끝 필드. 줄의 끝을 나타냅니다. record. The value of n may be either zero or one. Note that the end of line field is required and that it is reflected in the length of line record 위에서 언급 한 필드.
파일을 읽을 때 nnn nnnn
부분이 50이어야하는 1 nnn nnnn
을 반환 할 바이트가 예상됩니다.
다음을 사용하여이 작업을 수행 할 수있었습니다.
flag = byte >> 7
numbytes = int(bin(byte)[3:], 2)
그러나 numbytes 계산은 값싼 해결 방법처럼 느껴집니다.
numbytes 계산을 수행하기 위해 더 많은 비트 수학을 수행 할 수 있습니까?
어떻게 접근 하시겠습니까?
해결 방법
파일에서 바이트와 AND 처리 된 마스크를 사용하여 선행 비트를 제거 할 수 있습니다. 그러면 나머지 비트의 값이 남습니다.
mask = 0b01111111
byte_from_file = 0b10101010
value = mask & byte_from_file
print bin(value)
>> 0b101010
print value
>> 42
비트 마스킹을 할 때 16 진수보다 이진수를 이해하기가 더 쉽습니다.
편집 : 사용 사례에 대한 약간 더 완전한 예 :
LEADING_BIT_MASK = 0b10000000
VALUE_MASK = 0b01111111
values = [0b10101010, 0b01010101, 0b0000000, 0b10000000]
for v in values:
value = v & VALUE_MASK
has_leading_bit = v & LEADING_BIT_MASK
if value == 0:
print "EOL"
elif has_leading_bit:
print "leading one", value
elif not has_leading_bit:
print "leading zero", value
참조 페이지 https://stackoverflow.com/questions/9945720
'파이썬' 카테고리의 다른 글
파이썬에서 float 목록을 바이트로 압축하는 가장 빠른 방법 (0) | 2020.09.16 |
---|---|
파이썬 UnicodeEncodeError : 'ascii'코덱은 위치 20의 문자 u '\ xa0'을 인코딩 할 수 없습니다 : 서 수가 범위에 없습니다 (128). (0) | 2020.09.16 |
파이썬 정규식에서 시작과 끝을 어떻게 일치시킬 수 있습니까? (0) | 2020.09.16 |
파이썬 pip를 사용하여 한 번에 여러 Python 패키지를 설치하는 방법 (0) | 2020.09.16 |
파이썬 MultiThreaded PyQT에서 GUI 요소 업데이트 (0) | 2020.09.16 |
댓글