色胃康胶囊 发表于 2017-4-25 10:50:36

python的pack unpack函数

  转自:http://songpengfei.iteye.com/blog/1440637
  c语言在网络通信中经常会传输结构体数据,通常是二进制格式的,而python要想和c程序通信必须能够认识二进制的数据才行,不仅要认识而且还要能够解开c中的结构体数据,因为结构体通常会涉及到内存对齐的问题。
  下面是一个例子,用python中的struct模块可以完成这个功能:
  python写的服务器:
Python代码  


[*]import socket, struct  
[*]  
[*]s = socket.socket()  
[*]s.bind(('127.0.0.1', 8000))  
[*]s.listen(1)  
[*]  
[*]try:  
[*]    while True:  
[*]        cli, addr = s.accept()  
[*]        data = cli.recv(100)  
[*]  
[*]        print "recv %d bytes" % len(data)  
[*]        a, b, c = struct.unpack('i10sh', data)  
[*]        print a, b, c  
[*]  
[*]        sdata = struct.pack('i10sh', 34, "abcdefghi\0", 65)  
[*]        cli.send(sdata)  
[*]finally:  
[*]    s.close()  

  c写的客户端:
Java代码  


[*]/* tcp_client.c */  
[*]#include <stdio.h>  
[*]#include <stdlib.h>  
[*]#include <string.h>  
[*]#include <sys/types.h>  
[*]#include <sys/socket.h>  
[*]#include <netinet/in.h>  
[*]#include <arpa/inet.h>  
[*]#include <unistd.h>  
[*]  
[*]typedef struct _data {  
[*]    int a;  
[*]    char b[10];  
[*]    short c;  
[*]} Data;  
[*]  
[*]int main()  
[*]{  
[*]    int client_fd;  
[*]    struct sockaddr_in server_addr;  
[*]  
[*]    server_addr.sin_family = AF_INET;  
[*]    server_addr.sin_port = htons(8000);  
[*]    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  
[*]    bzero(&(server_addr.sin_zero), 8);  
[*]  
[*]    client_fd = socket(AF_INET, SOCK_STREAM, 0);  
[*]  
[*]    connect(client_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));  
[*]  
[*]    Data d;  
[*]    memset(&d, 0, sizeof(d));  
[*]    d.a = 3;  
[*]    memcpy(&d.b, "hello", 5);  
[*]    d.c = 6;  
[*]    send(client_fd, &d, sizeof(d), 0);  
[*]  
[*]    char buf[200];  
[*]    bzero(buf, 200);  
[*]    recv(client_fd, buf, sizeof(buf), 0);  
[*]  
[*]    Data* p = (Data*)&buf;  
[*]    printf("%d %s %d\n", p->a, p->b, p->c);  
[*]  
[*]    close(client_fd);  
[*]  
[*]    return 0;  
[*]}  
页: [1]
查看完整版本: python的pack unpack函数