c/c++에도 구조체가 있는데 여기서 구조체를 구조체라고 부르기 때문에 누구나 구조체라는 영어 단어에 익숙할 것입니다. 구조체는 Python에서도 사용됩니다. 이는 이 구조체가 c/C++의 구조체와 깊은 출처를 가져야 함을 완전히 보여줍니다. Python은 struct 모듈을 사용하여 Python 값과 C 구조 간의 변환을 수행하여 Python 바이트 객체를 형성합니다. 기본 C 구조에 대한 간략한 설명으로 형식 문자열을 사용하고 이를 이 형식 문자열을 기반으로 하는 Python 값으로 변환합니다.
우리는 Python이 문자열, 정수, 부동 소수점 숫자, 목록, 튜플 및 사전의 6가지 데이터 유형만 정의한다는 것을 알고 있습니다. 하지만 C 언어에는 바이트 유형의 변수가 있습니다. Python에서는 이를 어떻게 구현합니까? 이는 특히 데이터가 네트워크를 통해 전송되는 경우 매우 중요합니다.
Python은 변환을 제공하는 구조체 모듈을 제공합니다. 이 모듈의 몇 가지 방법은 다음과 같습니다.
pack(fmt, v1, v2, ...) ------ v1, v2, ... 값을 주어진 fmt가 설명하는 형식에 따라 문자열로 변환합니다.
unpack(fmt, bytes) ------ 주어진 fmt가 설명하는 형식에 따라 바이트를 역으로 구문 분석하고 튜플을 반환합니다.
calcsize(fmt) ------ 주어진 fmt가 설명하는 형식에 따라 구조의 크기를 반환합니다.
struct.pack():
struct.pack은 Python 값을 형식 문자에 따라 문자열로 변환하는 데 사용됩니다(Python에는 바이트(Byte) 유형이 없기 때문에 여기에 넣을 수 있습니다. 문자열은 바이트 스트림 또는 바이트 배열로 이해됩니다. 함수 프로토타입은 struct.pack(fmt, v1, v2, ...)이며 매개변수 fmt는 형식 문자열이며 형식 문자열에 대한 관련 정보는 아래에 소개되어 있습니다. v1, v2, ...는 변환할 Python 값을 나타냅니다. 다음 예에서는 두 개의 정수를 문자열(바이트 스트림)로 변환합니다.
>>> import struct
>>> a=20
>>> b =400
>>> str=struct.pack('ii',a,b) #바이트 스트림으로 변환합니다. 문자열이지만 네트워크에서 전송할 수 있습니다
> >> print len(str) #ii는 두 개의 정수를 나타냅니다
8 str
> 014에서 0x00001009는 각각 20과 400
>>> 이 중에서 예를 들어 다음 패키징 예시에서는 pack format = "!HH%ds" % len(data)buffer = struct.pack(format,opcode,blocknumber,data)
데이터를 패킹하고 일부를 추가하려고 합니다. 헤더의 경우 다음 형식 문자 정보를 통해 H는 부호가 없고 short는 2라는 것을 알 수 있습니다. 바이트이고 s는 char 유형입니다. 따라서 이 버퍼는 2바이트 opcode, 2바이트 블록 번호 및 len-long char입니다.
Python 모듈 - struct(바이트 스트림, 그룹화 및 압축 풀기 구현)
struct.unpack():
위의 예를 계속 실행해 보겠습니다.
>>> a1,a2=struct.unpack('ii',str)
>>> 인쇄 'a1',a1
a1 20
>>> print 'a2=',a2
a2= 400
"ii"는 4바이트로 나누어지고, 8바이트 str은 2바이트로 나누어진 것을 볼 수 있습니다 정수.
struct.calcsize(): 특정 형식의 출력 크기(예: 몇 바이트)를 계산하는 데 사용됩니다.
>>> struct.calcsize('HH4s' )
8
>>> struct.calcsize('ii')
8
>>>
>>> format='! % len('hello python')
>>> struct.calcsize(format)
16
>>>