本文簡單講述python怎麼產生和使用像C中的結構體
先上代碼
# im_netio.pyimport socketimport struct# server addresshost = "172.16.100.136"port = 8100# headhead_len = 12version = 6def im_connect(): s = socket.socket() s.connect((host, port)) return sdef 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) |