c语言在网络通信中经常会传输结构体数据,通常是二进制格式的,而python要想和c程序通信必须能够认识二进制的数据才行,不仅要认识而且还要能够解开c中的结构体数据,因为结构体通常会涉及到内存对齐的问题。
下面是一个例子,用python中的struct模块可以完成这个功能:
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写的客户端:
/* 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;
}
分享到:
相关推荐
在Python编程中,`pack`和`unpack`是`struct`模块中的两个关键函数,用于处理不同数据类型的字节序列转换。这两个函数在跨语言通信、数据存储或网络传输等场景中尤其有用,因为它们可以帮助我们将Python对象转换为...
`struct`模块包含了三个关键函数:`pack()`、`unpack()`和`calcsize()`。 1. `pack(fmt, v1, v2, ...)`: 这个函数用于将一系列值根据指定的格式`fmt`打包成一个字节串。`fmt`是一个包含格式代码的字符串,用于定义...
dir(struct) # 输出:['__doc__', '__name__', 'calcsize', 'error', 'pack', 'unpack'] ``` 12. enumerate(iterable):返回 enumerate 对象。iterable 必须是一个序列、一个迭代、或者其他支持迭代的对象。 例如:...
`pack`函数用于将Python值转化为字节串,而`unpack`函数则将字节串解码为Python值。格式字符串是用来指定如何进行转换的关键,它们由一系列的字母数字字符组成,代表了不同的数据类型。例如,`'i'`代表一个四字节的...
`pack`函数将整数转换为二进制数据流,而`unpack`函数则将二进制数据还原为整数。例如,使用`pack("@i", n)`将整数`n`按照指定格式`@i`打包成二进制数据,其中`@`是格式化标识符,表示无字节序,`i`表示整数类型。...
这里的关键是使用`struct.unpack`和`struct.unpack_from`函数来解析二进制数据。注意,当读取字符串时,我们需要对其进行解码操作。 ##### 3.3 构建包 下面是如何构建一个符合协议的数据包的例子: ```python key...
- **`struct.unpack()`函数**:用于从字节流中提取出Python变量。 - 参数同样是一个格式化字符串,指定要解包的字节流的格式。 - 返回一个元组,包含解包后的Python变量。 #### 结论 通过对上述内容的详细分析,...
这个版本还引入了新的字节码,如`UNPACK_EX`和`PACK_EX`,用于更灵活的数据解包和打包,这对于处理元组和列表等数据结构非常有帮助。 在标准库方面,Python 3.1增加了一些新模块,如`decimal`,提供了一个高精度...
- 函数如`struct.pack()`, `struct.unpack()`等。 - **xdrlib模块** - 提供XDR数据序列化的支持。 - 类如`xdrlib.Packer`, `xdrlib.Unpacker`等。 - **marshal模块** - 将Python值转换为字节序列。 - 函数如`...
`struct.pack()`用于将多个值打包成字节串,`struct.unpack()`则将字节串解包成多个值。在处理网络通信时,`struct`常用于编码和解码网络协议中的数据,如IP地址和端口号。 除了以上三个核心模块,还提到了`Mininet...
可以使用 Python 的 slicing 机制和 upper()、lower() 函数来实现字符串反转。例如: ``` def reverse_string(s): return s[::-1].swapcase() ``` 这个函数将输入字符串的大小写反转。 4. IP 地址和整数之间的互...
pack函数可以将Python中的数据类型如整数和浮点数等打包为字节序列(也就是字节字符串),而unpack函数则可以将字节序列解包为Python的基本数据类型。 pack函数使用处理指令作为第一个参数,这个处理指令由两部分...
在网上查到一篇贴子,使用struct模块里面的pack和unpack函数进行读写。下面就自己写代码验证一下。 >>> from struct import * >>> file = open(rc:/debug.txt, wb) >>> file.write(pack(idh, 12
struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, v1, v2, …) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) unpack(fmt, string) 按照给定的格式(fmt)解析...
总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。 python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制...a,=struct.unpack(‘i’,byte
- 设置LoRa通信参数:通过`setsockopt()`函数设置了数据速率,其中`SO_DR`为5,对应的是SF7BW125,即7阶扩频因子和125kHz的带宽。 - 数据打包与发送:使用`struct.pack('f', 3.14)`将浮点数3.14打包成二进制数据,...
`struct.pack()`将Python值按照指定的格式编码为字节流,`struct.unpack()`则将字节流解析回Python数据类型,这对于处理低级别的数据交换和网络通信很有用。 以上就是Python中一些常见的模块及其常用函数的详解,...
它主要通过两种函数:`pack`和`unpack`来完成这些操作。 1. `pack(format, v1, v2, ...)`: 这个函数将一组Python值按照指定的格式转换为字节串。格式字符串定义了要转换的数据类型。 2. `unpack(format, byte_...
`struct.unpack(fmt, string)` 用于将字节流转换回Python数据类型。它返回一个包含转换后值的元组。 **示例**: ```python import struct str = struct.pack("ii", 20, 400) a1, a2 = struct.unpack("ii", str) ...