Python은 struct 처리 2진법 (pack 및 unpack 사용법) 을 사용합니다

때때로python으로 이진 데이터를 처리해야 한다. 예를 들어 파일 저장, socket 작업 때.이때,python의struct 모듈을 사용하여 완성할 수 있습니다.struct로 c 언어의 구조체를 처리할 수 있습니다.
struct 모듈에서 가장 중요한 세 가지 함수는pack(), unpack(),calcsize()

#  (fmt), ( c )
pack(fmt, v1, v2, ...) 
 
#  (fmt) string, tuple
unpack(fmt, string)  
 
#  (fmt) 
calcsize(fmt)
지원되는 형식은 다음과 같습니다.
FORMAT
C TYPE
PYTHON TYPE
STANDARD SIZE
NOTES
x
pad byte
no value
-
-
c
char
string of length 1

-
b
signed char
integer

(3)
B
unsigned char
integer

(3)
?
_Bool
bool

(1)
h
short
integer

(3)
H
unsigned short
integer

(3)
i
int
integer

(3)
I
unsigned int
integer

(3)
l
long integer

(3)
-
L
unsigned long
integer

(3)
q
long long
integer

(2), (3)
Q
unsigned long long
integer

(2), (3)
f
float
float

(4)
d
double
float

(4)
s
char[]
string
-
-
p
char[]
string
-
-
P
void *
integer
-
(5), (3)
사용 방법은 fmt의 첫 번째 위치에 두는 것입니다. 예를 들어'@5s6sif'와 같습니다.
예 1:
구조체는 다음과 같습니다.

struct Header
{
 unsigned short id;
 char[4] tag;
 unsigned int version;
 unsigned int count;
}
소켓을 통해.recv는 위의 구조체 데이터를 받았습니다. 문자열 s에 존재합니다. 이제 그것을 해석해야 합니다. unpack () 함수를 사용할 수 있습니다.

import struct
id, tag, version, count = struct.unpack("!H4s2I", s)
위의 형식 문자열에서,!우리의 데이터는 네트워크에서 수신되었기 때문에 네트워크에서 전송될 때 네트워크 바이트 순서로 해석해야 한다는 것을 나타낸다.뒤에 있는 H는 unsigned short의 id를 나타내고, 4s는 4바이트의 긴 문자열을 나타내며, 2I는 두 개의 unsigned int 형식의 데이터를 나타낸다.
unpack을 통해 현재 id,tag,version,count에 우리의 정보를 저장했습니다.
마찬가지로 로컬 데이터를 struct 형식으로 쉽게 포장할 수 있습니다.

ss = struct.pack("!H4s2I", id, tag, version, count);
pack 함수는 id,tag,version,count를 지정한 형식에 따라 구조체 Header로 변환하였으며, ss는 현재 문자열(실제로는 c구조체와 유사한 바이트 흐름)으로 socket을 통해 가능합니다.send (ss) 이 문자열을 보냅니다.
예 2:

import struct
 
a=12.34

#  a 
bytes=struct.pack('i',a)
이때bytes는string 문자열로 문자열은 바이트에 따라 a의 2진 저장 내용과 같다.
다시 반작업을 하면 기존의 바이너리 데이터bytes(사실은 문자열)를 python의 데이터 형식으로 변환합니다.

#  ,unpack tuple !!
a,=struct.unpack('i',bytes)
여러 데이터로 구성된 경우 다음을 수행할 수 있습니다.

a='hello'
b='world!'
c=2
d=45.123
bytes=struct.pack('5s6sif',a,b,c,d)
이때의bytes는 바이너리 형식의 데이터입니다. 예를 들어binfile와 같은 파일을 직접 쓸 수 있습니다.write(bytes)
그리고 필요할 때 다시 읽을 수 있습니다.bytes=binfile.read()
다시 struct를 통과합니다.unpack () 을 python 변수로 디코딩합니다.

a,b,c,d=struct.unpack('5s6sif',bytes)
'5s6sif'는 fmt라고 하는데 포맷된 문자열로 숫자에 문자를 추가하여 구성되고 5s는 5자를 차지하는 문자열, 2i, 2개의 정수를 표시하는 등 다음은 사용할 수 있는 문자와 형식,ctype는python의 유형과 일일이 대응할 수 있음을 나타낸다.
참고: 바이너리 파일 처리 시 발생할 수 있는 문제
우리는 바이너리 파일을 처리할 때 다음과 같은 방법을 사용해야 한다.

binfile=open(filepath,'rb')  # 
 
binfile=open(filepath,'wb') # 
그렇다면 binfile=open(filepath,'r')의 결과와 도대체 어떻게 다릅니까?
다른 점은 두 가지가 있다.
첫째,'r'를 사용할 때'0x1A'를 만나면 파일이 끝나는 것으로 간주됩니다. 이것이 바로 EOF입니다.'rb'를 사용하면 이 문제가 존재하지 않습니다.즉, 바이너리로 쓰고 텍스트로 읽으면'0X1A'가 존재하면 파일의 일부분만 읽을 수 있습니다.'rb'를 사용할 때 파일 끝까지 읽습니다.
둘째, 문자열 x='abcdef'에 대해 우리는 len(x)을 사용하여 길이가 7이라고 할 수 있습니다. 우리는 줄 바꾸기라고 하는데 실제로는'0X0A'입니다.우리가'w'즉 텍스트 방식으로 쓸 때, 윈도우즈 플랫폼에서 자동으로'0X0A'를 두 문자'0X0D','0X0A', 즉 파일 길이가 실제로는 8로 바뀐다.'r'텍스트 방식으로 읽을 때, 자동으로 원래의 줄 바꿈 문자로 변환됩니다.'wb'2진법으로 바꾸면 문자가 변하지 않고 읽을 때도 그대로 읽습니다.그래서 텍스트로 쓰고 2진법으로 읽으면 이 많은 바이트를 고려해야 한다.0X0D'는 리턴 문자라고도 부른다.linux에서는 변하지 않습니다.linux는'0X0A'만 사용하여 줄을 바꾸기 때문입니다.
이상은Python이struct처리2진법(pack과unpack용법)을 사용하는 상세한 내용입니다. 더 많은pythonstruct처리2진법에 관한 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기