我尝试通过winsockets在Python和c程序之间进行进程间通信。发送字符串确实有效,但现在我尝试将一个int数组从c套接字发送到python套接字。
我已经发现我必须使用htonl()将int数组转换为字节流,因为winsock2的send函数不能直接发送int数组。
现在我想在python套接字中使用ntohl()但是receive函数返回字节,而ntohl()需要一个整数值作为输入。
这是我的代码
C-Side(只是相关部分):
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端(只是相关部分):
data = connection.recv(16)
data_i = socket.ntohl(data)
你收到的是字符串,没有ntohl引起异常?您可以使用struct module来解压缩 - 包含16个字节
struct.unpack('!4I', data)
含义 - 按网络顺序解压缩4个无符号32位整数
(我无法测试它 - 自己尝试)
编辑:哎呀,没看过你的评论。根据sockets docs,recv应返回字节类型的对象。如果它返回str类型的对象 - 你应该将它转换为字节 - 在Python3中它将是data.encode()
PS你在哪个Python?
你说你已经设法通过连接发送字符串。我假设你发送了一个char*
并在python中收到它作为一个字符串。你所做的是发送一个字节流。
现在您要发送一个整数数组。在内存中,整数再次存储为字节。每个整数可占用4/8个字节。您可以通过打印预先检查
printf("Size of integer is %zu", sizeof(int));
好的,现在我们知道需要发送多少字节。说它现在是4。
我们还需要知道整数的字节顺序,但现在让我们假设大端。
这意味着最低有效字节将是第一个,最后是有效字节。
所以现在你可以通过将数组转换为char*
并发送sizeof(array)
来发送你发送的整数数组。
但是在接收端,你只有一个字节流。要将其转换为整数数组,您需要一次获得4个字节并将其合并为一个整数。
我们可以这样做。
假设共有10个整数。你必须以某种方式单独传递这些信息。
bytes = connection.recv(10*4)
array = []
for i in range(10):
x = ord(bytes[i*4+0])
x += ord(bytes[i*4+1]) << 8
x += ord(bytes[i*4+2]) << 16
x += ord(bytes[i*4+3]) << 24
array += [x]
print x
你将能够看到整数数组。
这里函数ord
将一个字符转换为它的ASCII等效整数。
附注:
现在,如果你的系统的整数大小为8而不是4,你需要在python中扩展循环体。它将一直到56.而且每个索引的字节数都是i*8+...
类似地,如果结束性不同,则元素的顺序将改变。基本上bytes
的指数将从i*4+3
到i*4+0
。