Python 라이브러리의 struct 모듈 조항은 C 유형 구조체와 Python 바이트열 객체 간의 변환을 수행하는 데 유용합니다. 이는 struct 모듈에 정의된 Struct 클래스 및 해당 메서드뿐만 아니라 모듈 수준 함수에 의해 달성될 수 있습니다.
변환 함수는 형식 문자열을 사용합니다. 형식 문자열에 사용되는 바이트 순서, 크기 및 정렬은 다음 표에 따라 형식 지정 문자에 따라 결정됩니다.
바이트 순서 | 크기 | 정렬 | |
---|---|---|---|
@ | 네이티브 | 네이티브 | 네이티브 |
= | 네이티브 | 표준 | 없음 |
< | 리틀 엔디안 | 표준 | 없음 |
> | 빅 엔디안 | 표준 | 없음 |
! | 네트워크(=빅엔디안) | 표준 | 없음 |
다음 표는 C 유형 변수와 해당 Python 유형을 나타내는 데 사용되는 형식 문자를 보여줍니다.
C 유형 | 파이썬 유형 | |
---|---|---|
x | 패드 바이트 | 값 없음 |
c | 문자 | 길이가 1인 바이트 |
b/B | 서명/서명되지 않은 문자 | 정수 |
? | _Bool | 부울 |
h/H | 짧은/부호 없는 짧은 | 정수 |
나/나 | int/unsigned int | 정수 |
l/L | long/unsigned long | 정수 |
f | 플로트 | 플로트 |
d | 더블 | 플로트 |
s | 문자[] | 바이트 |
p | 문자[] | 바이트 |
P | 무효 * | 정수 |
다음 함수는 struct 모듈에 정의되어 있습니다.
팩()
이 함수는 형식 문자열 형식에 따라 압축된 값을 포함하는 바이트열 객체를 반환합니다. 형식 지정 문자는 형식에 필요한 값과 일치해야 합니다.
풀기()
이 함수는 형식 문자열 형식에 따라 버퍼에서 압축을 풉니다. 결과는 정확히 하나의 항목을 포함하더라도 튜플입니다.
다음 코드는 이러한 함수의 사용을 보여줍니다.
import struct student=(1, b'Rahul', 65.75) packed=struct.pack('I 5s f', *student) print ('packed data:',packed) unpacked=struct.unpack('I 5s f', packed) print ('unpacked data:',unpacked)
출력
packed data: b'\x01\x00\x00\x00Rahul\x00\x00\x00\x00\x80\x83B' unpacked data: (1, b'Rahul', 65.75)
Struct 클래스의 메소드를 사용하여 패킹/언패킹을 수행할 수도 있습니다. Struct 개체를 한 번 만들고 해당 메서드를 호출하는 것이 형식 문자열을 한 번만 컴파일하면 되므로 동일한 형식으로 구조체 함수를 호출하는 것보다 더 효율적입니다.
구조체(형식)
이 생성자는 형식 문자열 형식에 따라 이진 데이터를 쓰고 읽는 새 Struct 개체를 반환합니다.
팩()
이 메서드는 컴파일된 형식을 사용하는 pack() 함수와 동일합니다.
풀기()
이 메서드는 컴파일된 형식을 사용하는 unpack() 함수와 동일합니다.
다음 예제는 Struct 클래스를 사용하여 Python 데이터를 압축 및 압축 해제하는 방법을 보여줍니다.
s = struct.Struct('I 5s f') packed=s.pack(*student) print (packed) unpacked = s.unpack(packed) print (unpacked)
압축된 데이터는 명명된 튜플 개체로 직접 구문 분석될 수 있습니다.
from collections import namedtuple newstudent = namedtuple('newstudent','No Name Marks') s1 = newstudent._make(struct.unpack('I 5s f', packed)) print (s1)
출력
newstudent(No=1, Name=b'Rahul', Marks=65.75)