>  기사  >  백엔드 개발  >  Python에서 struct 모듈을 사용하여 바이트 스트림/바이너리 스트림을 작동하는 방법에 대한 튜토리얼

Python에서 struct 모듈을 사용하여 바이트 스트림/바이너리 스트림을 작동하는 방법에 대한 튜토리얼

高洛峰
高洛峰원래의
2017-02-20 10:46:061771검색

최근에 Python 네트워크 프로그래밍에 대해 배우고 있습니다. 간단한 소켓 통신 코드를 작성할 때 struct 모듈을 사용하는 것을 접했는데, 그 당시에는 그것이 무엇인지, 무엇을 하는지 잘 몰랐습니다. 관련 정보를 얻고 대략적인 아이디어를 얻었습니다. 이 기사는 주로 Python의 구조체 모듈에 의한 바이트 스트림/바이너리 스트림의 작동을 소개합니다.

머리말

최근에는 IDX 파일 형식으로 MNIST 데이터셋을 파싱하는데 Python을 사용하는데, 바이너리 파일을 읽어야 하는데, 내가 사용하는 것은 struct 모듈입니다. 인터넷에서 많은 튜토리얼을 확인했는데 모두 매우 훌륭했지만 초보자에게 그다지 친숙하지 않아서 빨리 시작할 수 있도록 몇 가지 참고 사항을 재구성했습니다.

참고: 튜토리얼에 나오는 다음 네 가지 용어는 동의어입니다: 바이너리 스트림, 바이너리 배열, 바이트 스트림, 바이트 배열

빨리 시작하세요

struct 모듈에서 정수, 부동 소수점 숫자 또는 문자 스트림(문자 배열)을 바이트 스트림(단어 섹션 배열)으로 변환합니다. , 형식 문자열 fmt를 사용하여 변환할 객체의 유형을 구조체 모듈에 알려야 합니다. 예를 들어 정수는 'i', 부동 소수점 숫자는 'f', ASCII 코드 문자는 's '.

def demo1():
 # 使用bin_buf = struct.pack(fmt, buf)将buf为二进制数组bin_buf
 # 使用buf = struct.unpack(fmt, bin_buf)将bin_buf二进制数组反转换回buf

 # 整型数 -> 二进制流
 buf1 = 256
 bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'
 ret1 = struct.unpack('i', bin_buf1)
 print bin_buf1, &#39; <====> &#39;, ret1

 # 浮点数 -> 二进制流
 buf2 = 3.1415
 bin_buf2 = struct.pack(&#39;d&#39;, buf2) # &#39;d&#39;代表&#39;double&#39;
 ret2 = struct.unpack(&#39;d&#39;, bin_buf2)
 print bin_buf2, &#39; <====> &#39;, ret2

 # 字符串 -> 二进制流
 buf3 = &#39;Hello World&#39;
 bin_buf3 = struct.pack(&#39;11s&#39;, buf3) # &#39;11s&#39;代表长度为11的&#39;string&#39;字符数组
 ret3 = struct.unpack(&#39;11s&#39;, bin_buf3)
 print bin_buf3, &#39; <====> &#39;, ret3

 # 结构体 -> 二进制流
 # 假设有一个结构体
 # struct header {
 # int buf1;
 # double buf2;
 # char buf3[11];
 # }
 bin_buf_all = struct.pack(&#39;id11s&#39;, buf1, buf2, buf3)
 ret_all = struct.unpack(&#39;id11s&#39;, bin_buf_all)
 print bin_buf_all, &#39; <====> &#39;, ret_all

출력 결과는 다음과 같습니다.

Python에서 struct 모듈을 사용하여 바이트 스트림/바이너리 스트림을 작동하는 방법에 대한 튜토리얼
demo1 출력 결과

struct 모듈에 대한 자세한 설명

주요 기능

struct 모듈에서 가장 중요한 세 가지 기능은 pack(), unpack(), calcsize()

# 按照给定的格式化字符串,把数据封装成字符串(实际上是类似于c结构体的字节流)
string = struct.pack(fmt, v1, v2, ...)

# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
tuple = unpack(fmt, string)

# 计算给定的格式(fmt)占用多少字节的内存
offset = calcsize(fmt)

구조체의 형식 문자열

구조체에서 지원되는 형식은 다음과 같습니다.


Format C Type Python 字节数
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer or lon 4
l long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void * long  

참고 1: q 및 Q는 컴퓨터가 64비트 작업을 지원할 때만 유용합니다.

참고 2: 각 형식 앞에는 숫자

를 나타내는 A 숫자가 올 수 있습니다. 참고 3: s 형식은 특정 길이의 문자열을 나타내고, 4s는 길이 4의 문자열을 나타내지만 p는 파스칼 문자열

참고 4: P는 포인터를 변환하는 데 사용되며, 그 길이는 기계어 길이와 관련이 있습니다.


참고 5: 마지막 것은 포인터를 나타내는 데 사용될 수 있습니다. 유형, 4바이트 점유


c의 구조와 데이터를 교환하려면 일부 C 또는 C++ 컴파일러가 바이트 정렬을 사용한다는 점도 고려해야 합니다. 일반적으로 32비트 시스템에서는 4바이트입니다. , 따라서 구조체는 형식의 첫 번째 문자를 사용하여 정렬을 변경할 수 있습니다.


Character Byte order Size and alignment
@ native native 凑够4个字节
= native standard 按原字节数
little-endian standard 按原字节数
> big-endian standard 按原字节数
! network (= big-endian) standard 按原字节数
사용 방법은 '@5s6sif'처럼 fmt 위치에 먼저 넣는 것입니다.

Python의 struct 모듈에 의한 바이트 스트림/바이너리 스트림 작업에 대한 더 많은 튜토리얼을 보려면 다음을 참고하세요. PHP 중국어 웹사이트!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.