복붙노트

[PYTHON] 파이썬에서 바이트를 비트로 변환

PYTHON

파이썬에서 바이트를 비트로 변환

나는 파이썬 3.2와 함께 일하고있다. 입력으로 16 진수 스트림을 가져 와서 비트 수준에서 구문 분석해야합니다. 그래서 나는

bytes.fromhex (input_str)

문자열을 실제 바이트로 변환합니다. 이제 어떻게이 바이트를 비트로 변환합니까?

해결법

  1. ==============================

    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. ==============================

    2.정수 수준에서 작업 할 때 작업 속도가 훨씬 빠릅니다. 특히 여기에 제안 된대로 문자열로 변환하는 것은 실제로 느립니다.

    정수 수준에서 작업 할 때 작업 속도가 훨씬 빠릅니다. 특히 여기에 제안 된대로 문자열로 변환하는 것은 실제로 느립니다.

    비트 7과 8 만 원하면 예를 들어

    val = (byte >> 6) & 3
    

    (이것은 : 바이트 6 비트 오른쪽으로 이동 - 그들을 삭제합니다. 다음 마지막 두 비트 만 유지 3 처음 2 비트 세트와 숫자입니다 ...)

    이것들은 초고속의 간단한 CPU 조작으로 쉽게 변환 될 수 있습니다.

  3. ==============================

    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. ==============================

    4.바이너리 :

    바이너리 :

    bin(byte)[2:].zfill(8)
    
  5. ==============================

    5.나는 여기에서 numpy를 사용하는 것이 가장 단순하다고 생각한다. 예를 들어 파일을 바이트로 읽은 다음 다음과 같이 쉽게 비트로 확장 할 수 있습니다.

    나는 여기에서 numpy를 사용하는 것이 가장 단순하다고 생각한다. 예를 들어 파일을 바이트로 읽은 다음 다음과 같이 쉽게 비트로 확장 할 수 있습니다.

    Bytes = numpy.fromfile(filename, dtype = "uint8")
    Bits = numpy.unpackbits(Bytes)
    
  6. ==============================

    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. ==============================

    7.format ()을 사용하여이를 수행하는 방법은 다음과 같습니다.

    format ()을 사용하여이를 수행하는 방법은 다음과 같습니다.

    print "bin_signedDate : ", ''.join(format(x, '08b') for x in bytevector)
    
  8. ==============================

    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. ==============================

    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 () 메서드보다이 메서드를 사용하는 것이 좋습니다.

  10. from https://stackoverflow.com/questions/8815592/convert-bytes-to-bits-in-python by cc-by-sa and MIT license