📜  struct trong python (1)

📅  最后修改于: 2023-12-03 14:47:44.157000             🧑  作者: Mango

Python中的Struct结构体

在Python中,struct模块提供了一种类似于C语言中的struct结构体的功能,可以用来创建不同字节顺序和不同数据类型的二进制数据。常常用于网络编程和文件处理等场合。

使用步骤
  1. 导入struct模块
import struct
  1. 定义一个格式化字符串

格式化字符串是一个描述数据类型和字节顺序的字符串,以<>!@=等开头,后跟若干个对应的数据类型字符。例如,<I表示4字节的unsigned int类型,顺序为小端。具体的数据类型和对应的字符可以查看官方文档

  1. 使用struct.pack()将数据按照格式化字符串打包成二进制数据
data = struct.pack('<I', 123)
  1. 使用struct.unpack()将二进制数据按照格式化字符串解包成数据
value = struct.unpack('<I', data)[0]
实例

以下实例演示了一个简单的传输二进制数据的例子,其中客户端向服务端发送一个数值,服务端接收并加1后返回给客户端。

客户端:

import socket
import struct

HOST = '127.0.0.1'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(struct.pack('<I', 123))
    data = s.recv(4)
    value = struct.unpack('<I', data)[0]
    print(value)

服务端:

import socket
import struct

HOST = '127.0.0.1'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        data = conn.recv(4)
        value = struct.unpack('<I', data)[0]
        value += 1
        conn.sendall(struct.pack('<I', value))
注意事项

使用struct时需要注意以下几点:

  • 格式化字符串中的格式和数据大小必须匹配,否则可能出现错误;
  • 大多数数据类型只有一种对应的格式字符,但有一些数据类型有多种格式字符,如short类型可以用hH表示;
  • 结构体中的字段可以用struct模块提供的不同类型的数据类型表示;
  • 如果需要使用无符号数的话,对应的格式化字符为大写字母,如<I表示unsigned int