Python 바 이 너 리 데이터 구조 Struct 의 구체 적 인 사용

바 이 너 리 데이터 구조 구조
C/C++언어 에서 struct 는 구조 체 라 고 불 린 다.한편,Python 에서 struct 는 바이트 문자열 과 원생 Python 데이터 구조 유형 간 의 전환 을 처리 하 는 전문 적 인 라 이브 러 리 입 니 다.
이 편 은 바 이 너 리 데이터 구조 struct 의 사용 방식 을 상세 하 게 소개 할 것 이다.
함수 와 Struct 클래스
struct 라 이브 러 리 는 모듈 급 함수 와 Struct 류 를 포함 합 니 다.형식 표시 자 는 문자열 형식 에서 컴 파일 표시 로 변 환 됩 니 다.이것 은 정규 표현 식 을 처리 하 는 방식 과 유사 합 니 다.
이 전환 은 일부 자원 을 소모 하기 때문에 Struct 인 스 턴 스 를 만 들 고 이 인 스 턴 스 에서 호출 방법 을 만 들 때 한 번 의 전환 만 완성 하면 더욱 효율 적 입 니 다.
포장 하 다.
Struct 는 형식 인디케이터 를 사용 하여 데 이 터 를 문자열 로 포장 하 는 것 을 지원 합 니 다.또한 문자열 에서 데 이 터 를 해제 하 는 것 을 지원 합 니 다.형식 인디케이터 는 데이터 형식 을 나타 내 는 문자열 과 선택 할 수 있 는 수량 과 바이트 순서 인디케이터 로 구성 되 어 있 습 니 다.
다음은 원 그룹 을 포장 하여 16 진 바이트 시퀀스 로 변환 합 니 다.예 는 다음 과 같 습 니 다.

import struct
import binascii

values = (2, 'lyj'.encode('UTF-8'), 3.8)
s = struct.Struct('I 3s f')
packed_data = s.pack(*values)
print("  :", values)
print("     :", s.format)
print("  :", s.size, 'bytes')
print("   :", binascii.hexlify(packed_data))
실행 후 효 과 는 다음 과 같 습 니 다.
打包
이곳 의 형식 인디케이터 는"I 3s f"입 니 다.앞에서 array 배열 을 소개 할 때,우 리 는 이미 표를 열거 한 적 이 있다.그 중에서 I 는 정형 또는 장정 형 을 표시 하고 3s 는 3 개의 바이트 문자열(lyj)을 표시 하 며 f 는 부동 점 수 를 나타 낸다.
가방 을 풀다
struct 라 이브 러 리 는 unpack()을 사용 하여 포 장 된 표시 데이터 에서 데 이 터 를 추출 할 수 있 습 니 다.여기 서 위의 포장 값 을 직접 복사 하여 테스트 할 수 있 습 니 다.예 는 다음 과 같다.

import struct
import binascii

packed_data = binascii.unhexlify(b'020000006c796a0033337340')
s = struct.Struct('I 3s f')
unpacked_data = s.unpack(packed_data)
print("   :", unpacked_data)
실행 후 효 과 는 다음 과 같 습 니 다.
解包
unpack()을 사용 하면 기본적으로 같은 값 을 얻 을 수 있 지만 부동 소수점 값 은 작은 차이 가 있 습 니 다.
바이트 순서 인디케이터
기본적으로 값 은 원생 C 라 이브 러 리 의 바이트 순서(endianness)로 인 코딩 됩 니 다.Struct 의 바이트 순서 표시 자 는 다음 표 와 같 습 니 다.
코드
속뜻
@
원생 순서
=
원생 기준
<
작은 일
>
대강
!
네트워크 순서
예 는 다음 과 같다.

import struct
import binascii

values = (2, 'lyj'.encode('UTF-8'), 3.8)
endianness = [
    ('@', '    '),
    ('=', '    '),
    ('<', '  '),
    ('>', '  '),
    ('!', '    '),
]
for code, name in endianness:
    s = struct.Struct(code + ' I 3s f')
    packed_data = s.pack(*values)
    print("      :", s.format, ' for ', name)
    print("  :", s.size, 'bytes')
    print("  :", binascii.hexlify(packed_data))
    print("  :", s.unpack(packed_data))
실행 후 효 과 는 다음 과 같 습 니 다.
字节序
바이트 순 서 를 바 꾸 어 인 코딩 하려 면 위 코드 와 같이 형식 문자열 에서 명시 적 인 바이트 순서 명령 만 바 꾸 면 이 기본 선택 을 쉽게 덮어 쓸 수 있 습 니 다.
버퍼
일반적으로 성능 을 강조 할 때 나 확장 모듈 에 데 이 터 를 전송 하거나 전송 할 때 바 이 너 리 패키지 데 이 터 를 처리 합 니 다.
모든 포장 구조 에 새로운 버퍼 를 할당 하 는 비용 을 피하 기 위해 서,일반적으로 우 리 는 pack 을 사용 합 니 다.into()와 unpackfrom()방법 은 미리 분 배 된 버퍼 를 직접 기록 하 는 것 을 지원 합 니 다.
예 는 다음 과 같다.

import struct
import binascii
import ctypes
import array

values = (2, 'lyj'.encode('UTF-8'), 3.8)
s = struct.Struct('I 3s f')
print("   :", values)
b = ctypes.create_string_buffer(s.size)
print("    (     ):", binascii.hexlify(b.raw))
s.pack_into(b, 0, *values)
print("    (     ):", binascii.hexlify(b.raw))
print("  :", s.unpack_from(b, 0))

a = array.array('b', b'\0' * s.size)
print("    (     ):", binascii.hexlify(a))
s.pack_into(a, 0, *values)
print('    (     ):', binascii.hexlify(a))
print("  :", s.unpack_from(a, 0))
실행 후 효 과 는 다음 과 같 습 니 다.
缓冲区
두 가지 방식 으로 버퍼 를 만 듭 니 다.그 중에서 size 속성 은 버퍼 에 필요 한 크기 를 가리 키 는 데 사 용 됩 니 다.
Pytho 바 이 너 리 데이터 구조 Struct 의 구체 적 인 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 Pytho 바 이 너 리 데이터 구조 Struct 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기