python 中的struct

本文简单讲述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相对的解包函数。
打包与解包的格式如下表
FormatC TypePython typeStandard sizeNotes
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)
 

posted on 2012-08-24 16:02  jogger  阅读(337)  评论(0编辑  收藏  举报

导航