我试图通过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}$
你说你已经成功地通过连接发送了字符串。我假设您发送了一个
char*
,并在python中以字符串的形式接收它。你所做的就是发送一个字节流。在现在需要发送一个整数数组。在内存中,整数再次作为字节存储。 每个整数可以占用4/8字节。你可以在手印前检查一下
好了,很好,现在我们知道需要发送多少字节了。假设现在是4。在
我们还需要知道整数的尾数,但现在让我们假设大端数。在
这意味着最低有效字节将位于第一个,最高有效字节将位于末尾。在
所以现在您可以通过将数组强制转换为
char*
并发送sizeof(array)
来发送您发送的整数数组。在但是在接收端,只有一个字节流。要将其转换为整数数组,您需要一次获取4个字节并将其合并为整数。在
我们可以这样做。在
假设有10个整数。你必须以某种方式分开传递这些信息。在
^{pr2}$你会看到你的整数数组。在
这里的函数
ord
将一个字符转换成它的ASCII等效整数。在旁注:
现在,如果系统的整数大小为8而不是4,则需要在python中扩展循环体。一直到56岁。同样,每个以字节为单位的索引将是
i*8+...
类似地,如果尾数不同,元素的顺序也会改变。基本上,}。在
bytes
上的索引将从i*4+3
变成{你收到的是字节串,不是ntohl导致异常吗? 您可以使用struct模块来解包-16个字节
含义-按网络顺序解压4个无符号32位整数
RTM
(我无法测试-你自己试试)
编辑: 哦,没看完你的评论。根据sockets docs,recv应该返回类型为bytes的对象。如果它返回类型为str的对象-您应该将其转换为字节-在Python3中它将是数据编码()
你在哪条Python上?在
相关问题 更多 >
编程相关推荐