`

python的pack unpack函数

 
阅读更多

转自:http://songpengfei.iteye.com/blog/1440637

 

c语言在网络通信中经常会传输结构体数据,通常是二进制格式的,而python要想和c程序通信必须能够认识二进制的数据才行,不仅要认识而且还要能够解开c中的结构体数据,因为结构体通常会涉及到内存对齐的问题。

 

下面是一个例子,用python中的struct模块可以完成这个功能:

 

python写的服务器:

Python代码   收藏代码
  1. import socket, struct  
  2.   
  3. s = socket.socket()  
  4. s.bind(('127.0.0.1'8000))  
  5. s.listen(1)  
  6.   
  7. try:  
  8.     while True:  
  9.         cli, addr = s.accept()  
  10.         data = cli.recv(100)  
  11.   
  12.         print "recv %d bytes" % len(data)  
  13.         a, b, c = struct.unpack('i10sh', data)  
  14.         print a, b, c  
  15.   
  16.         sdata = struct.pack('i10sh'34"abcdefghi\0"65)  
  17.         cli.send(sdata)  
  18. finally:  
  19.     s.close()  

 

c写的客户端:

 

Java代码   收藏代码
  1. /* tcp_client.c */  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <string.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7. #include <netinet/in.h>  
  8. #include <arpa/inet.h>  
  9. #include <unistd.h>  
  10.   
  11. typedef struct _data {  
  12.     int a;  
  13.     char b[10];  
  14.     short c;  
  15. } Data;  
  16.   
  17. int main()  
  18. {  
  19.     int client_fd;  
  20.     struct sockaddr_in server_addr;  
  21.   
  22.     server_addr.sin_family = AF_INET;  
  23.     server_addr.sin_port = htons(8000);  
  24.     server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  
  25.     bzero(&(server_addr.sin_zero), 8);  
  26.   
  27.     client_fd = socket(AF_INET, SOCK_STREAM, 0);  
  28.   
  29.     connect(client_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));  
  30.   
  31.     Data d;  
  32.     memset(&d, 0, sizeof(d));  
  33.     d.a = 3;  
  34.     memcpy(&d.b, "hello"5);  
  35.     d.c = 6;  
  36.     send(client_fd, &d, sizeof(d), 0);  
  37.   
  38.     char buf[200];  
  39.     bzero(buf, 200);  
  40.     recv(client_fd, buf, sizeof(buf), 0);  
  41.   
  42.     Data* p = (Data*)&buf;  
  43.     printf("%d %s %d\n", p->a, p->b, p->c);  
  44.   
  45.     close(client_fd);  
  46.   
  47.     return 0;  
  48. }  
分享到:
评论

相关推荐

    Python中的pack和unpack的使用

    在Python编程中,`pack`和`unpack`是`struct`模块中的两个关键函数,用于处理不同数据类型的字节序列转换。这两个函数在跨语言通信、数据存储或网络传输等场景中尤其有用,因为它们可以帮助我们将Python对象转换为...

    Python使用struct处理二进制(pack和unpack用法)

    `struct`模块包含了三个关键函数:`pack()`、`unpack()`和`calcsize()`。 1. `pack(fmt, v1, v2, ...)`: 这个函数用于将一系列值根据指定的格式`fmt`打包成一个字节串。`fmt`是一个包含格式代码的字符串,用于定义...

    python字符串常用函数.pdf

    dir(struct) # 输出:['__doc__', '__name__', 'calcsize', 'error', 'pack', 'unpack'] ``` 12. enumerate(iterable):返回 enumerate 对象。iterable 必须是一个序列、一个迭代、或者其他支持迭代的对象。 例如:...

    python.struct_helper_0_01

    `pack`函数用于将Python值转化为字节串,而`unpack`函数则将字节串解码为Python值。格式字符串是用来指定如何进行转换的关键,它们由一系列的字母数字字符组成,代表了不同的数据类型。例如,`'i'`代表一个四字节的...

    Python程序设计-3期(KC017) E82.docx

    `pack`函数将整数转换为二进制数据流,而`unpack`函数则将二进制数据还原为整数。例如,使用`pack("@i", n)`将整数`n`按照指定格式`@i`打包成二进制数据,其中`@`是格式化标识符,表示无字节序,`i`表示整数类型。...

    对python 自定义协议的方法详解

    这里的关键是使用`struct.unpack`和`struct.unpack_from`函数来解析二进制数据。注意,当读取字符串时,我们需要对其进行解码操作。 ##### 3.3 构建包 下面是如何构建一个符合协议的数据包的例子: ```python key...

    python 和C语言数据结构解析于构建

    - **`struct.unpack()`函数**:用于从字节流中提取出Python变量。 - 参数同样是一个格式化字符串,指定要解包的字节流的格式。 - 返回一个元组,包含解包后的Python变量。 #### 结论 通过对上述内容的详细分析,...

    python官方3.1版本msi安装包

    这个版本还引入了新的字节码,如`UNPACK_EX`和`PACK_EX`,用于更灵活的数据解包和打包,这对于处理元组和列表等数据结构非常有帮助。 在标准库方面,Python 3.1增加了一些新模块,如`decimal`,提供了一个高精度...

    python standerd labrary中文版

    - 函数如`struct.pack()`, `struct.unpack()`等。 - **xdrlib模块** - 提供XDR数据序列化的支持。 - 类如`xdrlib.Packer`, `xdrlib.Unpacker`等。 - **marshal模块** - 将Python值转换为字节序列。 - 函数如`...

    python中网络相关的包和函数(csdn)————程序.pdf

    `struct.pack()`用于将多个值打包成字节串,`struct.unpack()`则将字节串解包成多个值。在处理网络通信时,`struct`常用于编码和解码网络协议中的数据,如IP地址和端口号。 除了以上三个核心模块,还提到了`Mininet...

    python笔试题

    可以使用 Python 的 slicing 机制和 upper()、lower() 函数来实现字符串反转。例如: ``` def reverse_string(s): return s[::-1].swapcase() ``` 这个函数将输入字符串的大小写反转。 4. IP 地址和整数之间的互...

    简单介绍Python中的struct模块

    pack函数可以将Python中的数据类型如整数和浮点数等打包为字节序列(也就是字节字符串),而unpack函数则可以将字节序列解包为Python的基本数据类型。 pack函数使用处理指令作为第一个参数,这个处理指令由两部分...

    python读写二进制文件的方法

    在网上查到一篇贴子,使用struct模块里面的pack和unpack函数进行读写。下面就自己写代码验证一下。 &gt;&gt;&gt; from struct import * &gt;&gt;&gt; file = open(rc:/debug.txt, wb) &gt;&gt;&gt; file.write(pack(idh, 12

    Python使用struct处理二进制的实例详解

    struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, v1, v2, …) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) unpack(fmt, string) 按照给定的格式(fmt)解析...

    使用Python进行二进制文件读写的简单方法(推荐)

    总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。 python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制...a,=struct.unpack(‘i’,byte

    演示如何使用Python和PyLoRa库在LoRa设备之间进行通信

    - 设置LoRa通信参数:通过`setsockopt()`函数设置了数据速率,其中`SO_DR`为5,对应的是SF7BW125,即7阶扩频因子和125kHz的带宽。 - 数据打包与发送:使用`struct.pack('f', 3.14)`将浮点数3.14打包成二进制数据,...

    python有关的模块

    `struct.pack()`将Python值按照指定的格式编码为字节流,`struct.unpack()`则将字节流解析回Python数据类型,这对于处理低级别的数据交换和网络通信很有用。 以上就是Python中一些常见的模块及其常用函数的详解,...

    使用python的struct库实现IP地址计算,根据一个int值.zip

    它主要通过两种函数:`pack`和`unpack`来完成这些操作。 1. `pack(format, v1, v2, ...)`: 这个函数将一组Python值按照指定的格式转换为字节串。格式字符串定义了要转换的数据类型。 2. `unpack(format, byte_...

    python的struct模块.docx

    `struct.unpack(fmt, string)` 用于将字节流转换回Python数据类型。它返回一个包含转换后值的元组。 **示例**: ```python import struct str = struct.pack("ii", 20, 400) a1, a2 = struct.unpack("ii", str) ...

Global site tag (gtag.js) - Google Analytics