>  기사  >  백엔드 개발  >  Python에서 이진 데이터를 읽는 방법은 무엇입니까?

Python에서 이진 데이터를 읽는 방법은 무엇입니까?

PHPz
PHPz앞으로
2023-05-08 18:58:062073검색

bytes

bytes: 문자 시퀀스의 한 유형입니다. dir(str)과 dir(bytes)를 비교하면 둘의 속성과 메서드가 몇 가지 차이점만 제외하고 매우 유사하다는 것을 알 수 있습니다. 따라서 바이트는 검색(find), 길이(len), 자르기(split), 슬라이싱 등과 같이 문자열과 같은 바이트 시퀀스에 대한 다양한 작업 방법을 가질 수도 있습니다.

bytes의 장점은 Python이 내장되어 있어 추가 타사 모듈을 설치할 필요가 없다는 것입니다.

그러나 단점도 분명합니다. 단일 쿼리만 쿼리할 수 있고 한 번에 여러 필수 결과를 쿼리할 수는 없습니다.

먼저 open의 rb 모드를 통해 파일을 열고 내용을 바이트 형식으로 읽습니다. 특정 문자열을 찾는 find() 메소드가 있는데 이 메소드는 요구사항에 맞는 첫 번째 문자열 인덱스만 찾을 수 있고, 단일 비트 인덱스가 아닌 8비트 1바이트 인덱스를 제공한다. 일치하는 여러 문자열을 찾아야 하는 경우 내장된 findall() 메서드가 없습니다. 여러 개를 쿼리하려면 먼저 첫 번째 일치하는 인덱스 1을 찾고, 이 인덱스 1로 시작하고, 두 번째 일치하는 인덱스 2를 쿼리하는 식으로 쿼리가 끝날 때까지 계속됩니다.

with open(path, 'rb') as f:
    datas = f.read()
    start_char = datas.find(b'Start')
    # start_char2 = datas.find(b'Start', start_char)
    end_char = datas.find(b'End', start_char)
    # end_char2 = datas.find(b'End', start_char2)
    data = datas[start_char:end_char]
    print(data)

위 코드에서는 start_char과 end_char가 여러 번 나타나며 시간이 반드시 동일하지는 않습니다. 두 인덱스 사이의 내용을 가져와야 하지만 한 번에 반복하거나 확인할 수는 없습니다. 키워드 인덱스를 얻으려면 주석 처리된 코드 줄을 여러 번 실행해야 합니다. 파일 데이터에 몇 개의 시작 플래그가 있을지 모르기 때문에 몇 번이나 실행될지는 알 수 없습니다. 이는 루핑으로 해결해야 하는데 루핑을 위한 변수는 없는 것 같습니다. 이로 인해 문제가 더욱 복잡해집니다.

둘째, 두 기호 사이의 내용을 구하게 되므로 위의 과정을 두 번 수행해야 합니다. 따라서 프로세스가 더욱 복잡해집니다.

따라서 새로운 방법을 찾는 것이 절대적으로 필요합니다.

bitstring

bitstring은 바이트 스트림 형식으로 바이너리 파일을 읽는 타사 패키지입니다.

bitstring.py 파일의 첫 번째 문장은 다음과 같습니다. 이 패키지는 데이터의 비트 단위 생성, 조작 및 해석을 단순화하는 클래스를 정의합니다.

번역은 다음과 같습니다. 이 패키지는 비트 단위 생성, 조작 및 조작을 단순화하는 클래스를 정의합니다. 그리고 데이터 해석을 설명합니다.

간단히 이해하면 바이트 형태의 데이터를 직접 연산하는 것입니다.

다음과 같은 4개의 주요 클래스가 있습니다.

Bits - 바이너리 데이터를 위한 변경 불가능한 컨테이너.
BitArray - 바이너리 데이터를 위한 변경 가능한 컨테이너.
ConstBitStream - 스트리밍 메소드가 있는 변경 불가능한 컨테이너.
BitStream -- 스트리밍 방법이 포함된 변경 가능한 컨테이너입니다.

Bits - 바이너리 데이터를 위한 변경 불가능한 컨테이너입니다.
BitArray -- 이진 데이터의 변경 가능한 컨테이너입니다.
ConstBitStream -- 스트림 메소드가 있는 불변 컨테이너입니다.
BitStream -- 스트림 메소드가 있는 변경 가능한 컨테이너입니다.

바이트처럼 먼저 파일 내용을 읽고 키워드 인덱스를 찾은 다음 슬라이스하여 데이터 내용을 얻습니다.

# update at 2022/05/06 start
# from bistring import ConstBitStream, BitStream
from bitstring import ConstBitStream, BitStream
# update at 2022/05/06 end

hex_datas = ConstBitStream(filename=path)  # 读取文件内容
start_char = b'Start'
start_chars = hex_datas.findall(start_char, bytealigned=True)  # 一次找到全部符合的,返回一个生成器
start_indexs = []
for start_char in start_chars:
    start_indexs.append(start_char)

end_char = b'End'
end_indexs = []
for start_index in start_indexs:
    end_chars = hex_datas.find(end_char, start=start_index, bytealigned=True)  # 找到第一个符合的,返回元组
    for end_char in end_chars:
        end_indexs.append(end_char)

result = []
for i in range(min(len(start_indexs), len(end_indexs))):
    hex_data = hex_datas[start_indexs[i]:end_indexs[i]]
    str_data = BitStream.tobytes(hex_data).decode('utf-8')
    result.append(str_data)

코드 분석, 먼저 ConstBitStream, BitStream이라는 두 가지 필수 클래스를 가져옵니다. 파일 내용을 가져오기 위해 findall()은 일치하는 모든 문자열 인덱스를 찾고 find()는 첫 번째로 일치하는 문자열 인덱스를 찾습니다. start와 end의 두 목록 중 더 작은 값을 가져와서 데이터를 얻습니다. 유형은 "bitstring.ConstBitStream"입니다. BitStream.tobytes() 메서드는 이를 바이트 유형으로 변환하므로 사용합니다. decode()를 사용하여 필요한 문자열을 디코딩하고 가져옵니다.

전체 과정은 간단하고 연속적입니다. findall(), find() 및 tobytes() 메서드가 코드에서 사용됩니다. 또한 주의해야 할 작은 세부 사항이 많이 있습니다. 예를 들어 start_indexs가 비어 있으면 후속 코드를 실행해서는 안 되며, end_indexs도 비어 있으면 마찬가지입니다.

비트스트링 패키지가 비교적 사용하기 쉽다는 것을 알 수 있습니다. 필요에 따라 사용되는 방법은 상대적으로 적습니다. 실제로는 다른 방법도 많이 있으므로 필요에 따라 선택하세요.

위 내용은 Python에서 이진 데이터를 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제