[PYTHON] 파이썬에서 바이트를 비트로 변환
PYTHON파이썬에서 바이트를 비트로 변환
나는 파이썬 3.2와 함께 일하고있다. 입력으로 16 진수 스트림을 가져 와서 비트 수준에서 구문 분석해야합니다. 그래서 나는
bytes.fromhex (input_str)
문자열을 실제 바이트로 변환합니다. 이제 어떻게이 바이트를 비트로 변환합니까?
해결법
-
==============================
1.이렇게하는 또 다른 방법은 bitstring 모듈을 사용하는 것입니다.
이렇게하는 또 다른 방법은 bitstring 모듈을 사용하는 것입니다.
>>> from bitstring import BitArray >>> input_str = '0xff' >>> c = BitArray(hex=input_str) >>> c.bin '0b11111111'
그리고 만약 당신이 선도적 인 0b를 제거해야한다면 :
>>> c.bin[2:] '11111111'
bitstring 모듈은 jcollado의 대답처럼 요구 사항이 아니지만 입력을 비트로 변환하고 조작하는 데 유용한 메서드가 많이 있습니다. 예를 들어 다음과 같이 유용 할 수도 있습니다.
>>> c.uint 255 >>> c.invert() >>> c.bin[2:] '00000000'
기타
-
==============================
2.정수 수준에서 작업 할 때 작업 속도가 훨씬 빠릅니다. 특히 여기에 제안 된대로 문자열로 변환하는 것은 실제로 느립니다.
정수 수준에서 작업 할 때 작업 속도가 훨씬 빠릅니다. 특히 여기에 제안 된대로 문자열로 변환하는 것은 실제로 느립니다.
비트 7과 8 만 원하면 예를 들어
val = (byte >> 6) & 3
(이것은 : 바이트 6 비트 오른쪽으로 이동 - 그들을 삭제합니다. 다음 마지막 두 비트 만 유지 3 처음 2 비트 세트와 숫자입니다 ...)
이것들은 초고속의 간단한 CPU 조작으로 쉽게 변환 될 수 있습니다.
-
==============================
3.이런 건 어때?
이런 건 어때?
>>> bin(int('ff', base=16)) '0b11111111'
이렇게하면 16 진수 문자열이 정수로 변환되고 해당 정수는 정수의 비트 값에 따라 각 바이트가 0/1로 설정된 문자열로 변환됩니다.
주석으로 지적했듯이 0b 접두사를 제거해야하는 경우 다음과 같이 할 수 있습니다.
>>> bin(int('ff', base=16)).lstrip('0b') 11111111
또는이 방법 :
>>> bin(int('ff', base=16))[2:] 11111111
-
==============================
4.바이너리 :
바이너리 :
bin(byte)[2:].zfill(8)
-
==============================
5.나는 여기에서 numpy를 사용하는 것이 가장 단순하다고 생각한다. 예를 들어 파일을 바이트로 읽은 다음 다음과 같이 쉽게 비트로 확장 할 수 있습니다.
나는 여기에서 numpy를 사용하는 것이 가장 단순하다고 생각한다. 예를 들어 파일을 바이트로 읽은 다음 다음과 같이 쉽게 비트로 확장 할 수 있습니다.
Bytes = numpy.fromfile(filename, dtype = "uint8") Bits = numpy.unpackbits(Bytes)
-
==============================
6.읽기 바이트를 읽을 때 ord를 사용하십시오.
읽기 바이트를 읽을 때 ord를 사용하십시오.
byte_binary = bin(ord(f.read(1))) # Add [2:] to remove the "0b" prefix
또는
str.format () 사용 :
'{:08b}'.format(ord(f.read(1)))
-
==============================
7.format ()을 사용하여이를 수행하는 방법은 다음과 같습니다.
format ()을 사용하여이를 수행하는 방법은 다음과 같습니다.
print "bin_signedDate : ", ''.join(format(x, '08b') for x in bytevector)
-
==============================
8.다른 답변은 빅 엔디안 순서로 비트를 제공합니다 ( '\ x01'은 '00000001'이됩니다).
다른 답변은 빅 엔디안 순서로 비트를 제공합니다 ( '\ x01'은 '00000001'이됩니다).
리틀 엔디 언 순서에 관심이있는 경우에는 bignum 등의 일반적인 표현과 같이 많은 경우에 유용합니다. 여기에 그 발췌 문장이 있습니다 :
def bits_little_endian_from_bytes(s): return ''.join(bin(ord(x))[2:].rjust(8,'0')[::-1] for x in s)
그리고 다른 방향 :
def bytes_from_bits_little_endian(s): return ''.join(chr(int(s[i:i+8][::-1], 2)) for i in range(0, len(s), 8))
-
==============================
9.파이썬 형식 문자열 구문 사용
파이썬 형식 문자열 구문 사용
>>> mybyte = bytes.fromhex("0F") # create my byte using a hex string >>> binary_string = "{:08b}".format(int(mybyte.hex(),16)) >>> print(binary_string) 00001111
두 번째 라인은 마술이 일어나는 곳입니다. 모든 바이트 객체에는 16 진수 문자열을 반환하는 .hex () 함수가 있습니다. 이 16 진수 문자열을 사용하여 int () 함수에 기본 16 문자열 (16 진수가 기본 16이기 때문에)을 알리는 정수로 변환합니다. 그런 다음이 정수에 서식을 적용하여 이진 문자열로 표시합니다. {: 08b}는 진정한 마법이 일어나는 곳입니다. 형식 사양 미니 언어 format_spec을 사용하고 있습니다. 특히 그것은 format_spec 구문의 너비와 유형 부분을 사용합니다. 8 세트 폭은 8로, 이는 우리가 멋진 0000 패딩을 얻는 방법이고, b는 타입을 바이너리로 설정합니다.
형식 문자열을 사용하면 유연성이 향상되므로 bin () 메서드보다이 메서드를 사용하는 것이 좋습니다.
from https://stackoverflow.com/questions/8815592/convert-bytes-to-bits-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬으로 rss 리다이렉트하기 / urllib2 (0) | 2018.11.16 |
---|---|
[PYTHON] chromedriver가있는 Selenium Python으로 전체 페이지의 스크린 샷 찍기 (0) | 2018.11.16 |
[PYTHON] QWidget은 배경색을 그려 내지 않습니다. (0) | 2018.11.16 |
[PYTHON] 요청 파이썬 라이브러리에서 HTTP 요청의 다운로드 속도를 제한하는 방법은 무엇입니까? (0) | 2018.11.16 |
[PYTHON] 파이썬 : 유니 코드 문자열을 살균 하시겠습니까? [복제] (0) | 2018.11.16 |