2008-09-02 3 views
25

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

제안 사항?

답변

25

있다. 비트를 기본 구성 요소로 사용하여 데이터를 읽고 수정하고 구성 할 수 있습니다. 최신 버전은 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() 

전체 설명서는 here입니다.

+0

패킷 [11:24] .uint가 패킷 [12:24] .uint 여야한다고 생각합니다. 필드는 13 비트 길이이고, 비트 12에서 시작하여 비트 24에서 끝납니다. –

+0

이것은 실제로 주석이 아니고 대답이 아니어야합니다. 그러나 아니요, 실제로는 [11:24]입니다. 인덱스는 0부터 시작하여 최종 인덱스 (파이썬 및 기타 많은 언어에서 표준 사용법)를 포함하지 않습니다. 따라서 첫 번째 비트 조각은 [0 : 1]이고 [12:24]는 13 비트에서 24 비트까지의 12 비트 조각입니다. 길이는 항상 두 인덱스의 차이입니다. –

관련 문제