Python套接字:无法接收int数组

2024-04-26 04:52:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过winsockets在Python和c程序之间进行进程间通信。发送一个字符串确实有效,但是现在我尝试从c套接字向python套接字发送一个int数组。在

我已经发现我必须使用htonl()将int数组转换成字节流,因为winsock2的send函数不能直接发送int数组。在

现在我想在python套接字中使用ntohl(),但是receive函数返回字节,而ntohl()需要一个整数值作为输入。在

这是我的密码

C侧(仅相关部件):

uint32_t a[1] = {1231};
uint32_t a_converted[1]={0};
a_converted[0] = htonl(a[0]);
iResult = send( ConnectSocket, ( char *)   a_converted, sizeof( a_converted), 0 );

Python端(仅相关部分):

^{pr2}$

Tags: 函数字符串程序send字节进程数组间通信
2条回答

你说你已经成功地通过连接发送了字符串。我假设您发送了一个char*,并在python中以字符串的形式接收它。你所做的就是发送一个字节流。在

现在需要发送一个整数数组。在内存中,整数再次作为字节存储。 每个整数可以占用4/8字节。你可以在手印前检查一下

printf("Size of integer is %zu", sizeof(int));

好了,很好,现在我们知道需要发送多少字节了。假设现在是4。在

我们还需要知道整数的尾数,但现在让我们假设大端数。在

这意味着最低有效字节将位于第一个,最高有效字节将位于末尾。在

所以现在您可以通过将数组强制转换为char*并发送sizeof(array)来发送您发送的整数数组。在

但是在接收端,只有一个字节流。要将其转换为整数数组,您需要一次获取4个字节并将其合并为整数。在

我们可以这样做。在

假设有10个整数。你必须以某种方式分开传递这些信息。在

^{pr2}$

你会看到你的整数数组。在

这里的函数ord将一个字符转换成它的ASCII等效整数。在

旁注:

现在,如果系统的整数大小为8而不是4,则需要在python中扩展循环体。一直到56岁。同样,每个以字节为单位的索引将是i*8+...

类似地,如果尾数不同,元素的顺序也会改变。基本上,bytes上的索引将从i*4+3变成{}。在

你收到的是字节串,不是ntohl导致异常吗? 您可以使用struct模块来解包-16个字节

struct.unpack('!4I', data)

含义-按网络顺序解压4个无符号32位整数

RTM

(我无法测试-你自己试试)

编辑: 哦,没看完你的评论。根据sockets docsrecv应该返回类型为bytes的对象。如果它返回类型为str的对象-您应该将其转换为字节-在Python3中它将是数据编码()

你在哪条Python上?在

相关问题 更多 >