본문 바로가기
파이썬

파이썬 Python : 바이트에서 비트 추출

by º기록 2020. 9. 16.
반응형

파이썬으로 바이너리 파일을 읽고 있는데 파일 형식에 대한 설명서는 다음과 같습니다.

플래그 (바이너리) 의미

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

 

 

반응형

댓글