복붙노트

[PYTHON] 파이썬에서 비트 필드 조작을 수행하는 가장 좋은 방법은 무엇입니까?

PYTHON

파이썬에서 비트 필드 조작을 수행하는 가장 좋은 방법은 무엇입니까?

내가 UDP를 통해 몇 가지 MPEG 전송 스트림 프로토콜을 읽고있어 그리고 그것에 (예를 들어 길이 13) 펑키 bitfields있다. 나는 "구조체"라이브러리를 사용하여 광범위하게 압축을 풀지 만, 비트 조작을 손으로 조정해야하는 대신 "다음 13 비트를 잡아라"라고 말하는 간단한 방법이 있습니까? 나는 C가 비트 필드 (C로 되돌릴 필요없이)와 같은 것을 원한다.

제안?

해결법

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

    1.자주 묻는 질문입니다. ASPN Cookbook 항목이있어 과거에는 나를 도와 줬어.

    자주 묻는 질문입니다. ASPN Cookbook 항목이있어 과거에는 나를 도와 줬어.

    그리고 한 사람이이 작업을 수행하는 모듈에서보고 싶은 광범위한 요구 사항 페이지가 있습니다.

  2. ==============================

    2.bitstring 모듈은이 문제를 해결하도록 설계되었습니다. 비트를 기본 구성 요소로 사용하여 데이터를 읽고 수정하고 구성 할 수 있습니다. 최신 버전은 Python 2.6 이상 (Python 3 포함)이지만 버전 1.0은 Python 2.4 및 2.5도 지원합니다.

    bitstring 모듈은이 문제를 해결하도록 설계되었습니다. 비트를 기본 구성 요소로 사용하여 데이터를 읽고 수정하고 구성 할 수 있습니다. 최신 버전은 Python 2.6 이상 (Python 3 포함)이지만 버전 1.0은 Python 2.4 및 2.5도 지원합니다.

    트랜스 포트 스트림에서 모든 널 패킷을 제거하는 (그리고 아마도 13 비트 필드를 사용하는 것) 관련 예제가 있습니다.

    from bitstring import Bits, BitStream  
    
    # Opening from a file means that it won't be all read into memory
    s = Bits(filename='test.ts')
    outfile = open('test_nonull.ts', 'wb')
    
    # Cut the stream into 188 byte packets
    for packet in s.cut(188*8):
        # Take a 13 bit slice and interpret as an unsigned integer
        PID = packet[11:24].uint
        # Write out the packet if the PID doesn't indicate a 'null' packet
        if PID != 8191:
            # The 'bytes' property converts back to a string.
            outfile.write(packet.bytes)
    

    다음은 비트 스트림에서 읽기를 포함하는 또 다른 예입니다.

    # You can create from hex, binary, integers, strings, floats, files...
    # This has a hex code followed by two 12 bit integers
    s = BitStream('0x000001b3, uint:12=352, uint:12=288')
    # Append some other bits
    s += '0b11001, 0xff, int:5=-3'
    # read back as 32 bits of hex, then two 12 bit unsigned integers
    start_code, width, height = s.readlist('hex:32, 2*uint:12')
    # Skip some bits then peek at next bit value
    s.pos += 4
    if s.peek(1):
        flags = s.read(9)
    

    표준 슬라이스 표기법을 사용하여 비트 수준에서 슬라이스, 삭제, 역전, 덮어 쓰기 등의 작업을 수행 할 수 있으며 비트 수준 찾기, 바꾸기, 분할 등의 기능이 있습니다. 다양한 엔디안이 지원됩니다.

    # Replace every '1' bit by 3 bits
    s.replace('0b1', '0b001')
    # Find all occurrences of a bit sequence
    bitposlist = list(s.findall('0b01000'))
    # Reverse bits in place
    s.reverse()
    

    전체 문서는 여기에 있습니다.

  3. from https://stackoverflow.com/questions/39663/what-is-the-best-way-to-do-bit-field-manipulation-in-python by cc-by-sa and MIT license