本文简单讲述python怎么生成和使用像C中的结构体
先上代码
# im_netio.py import socket import struct # server address host = "172.16.100.136" port = 8100 # head head_len = 12 version = 6 def im_connect(): s = socket.socket() s.connect((host, port)) return s def im_send(sock, pack): head = struct.pack('iii', head_len, len(pack), version) sock.send(head) plen = sock.send(pack) f = open('netio.txt', 'a') f.write('send:') f.write(pack) f.write('\n') f.close() def im_recv(sock): buf = sock.recv(12) hlen, plen, version = struct.unpack('iii', buf) backlen = plen while plen > 0: buf = sock.recv(plen) plen -= len(buf) f = open('netio.txt', 'a') f.write('recv:') f.write(buf) f.write('\n') f.close() return buf
封装了三个函数 im_connect im_send im_recv;
im_send先发送了一个包头,再发送数据,并将发送的内容(不包括包头)保存进本地文件。
实际上,包头就是C中的一个结构体:
struct pack_head_st { // 自身长度 size_t size; // 紧跟在自身后面的数据长度 size_t len; // 版本 size_t version; }pack_head_t;
head = struct.pack('iii', head_len, len(pack), version)
struct.pack就是将第一个参数之后的参数打包成一个结构体,格式就是第一个参数中的'iii',意为将三个int类型变量存进一个结构体,并返回为head。
然后发送,这个不用说了。
im_recv中,使用了struct.unpack,即struct.pack相对的解包函数。
打包与解包的格式如下表
Format | C Type | Python type | Standard size | Notes |
---|---|---|---|---|
x | pad byte | no value | ||
c | char | string of length 1 | 1 | |
b | signed char | integer | 1 | (3) |
B | unsigned char | integer | 1 | (3) |
? | _Bool | bool | 1 | (1) |
h | short | integer | 2 | (3) |
H | unsigned short | integer | 2 | (3) |
i | int | integer | 4 | (3) |
I | unsigned int | integer | 4 | (3) |
l | long | integer | 4 | (3) |
L | unsigned long | integer | 4 | (3) |
q | long long | integer | 8 | (2), (3) |
Q | unsigned long long | integer | 8 | (2), (3) |
f | float | float | 4 | (4) |
d | double | float | 8 | (4) |
s | char[] | string | ||
p | char[] | string | ||
P | void * | integer | (5), (3) |