Python은 struct 처리 2진법 (pack 및 unpack 사용법) 을 사용합니다
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진법에 관한 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.