我尝试通过winsockets在Python和c程序之间进行进程间通信。发送字符串确实有效,但现在我尝试将一个int数组从c套接字发送到python套接字。
我已经发现我必须使用htonl()将int数组转换为字节流,因为winsock2的send函数不能直接发送int数组。
现在我想在python套接字中使用ntohl()但是receive函数返回字节,而ntohl()需要一个整数值作为输入。
这是我的代码
C-Side(只是相关部分):
[
{
placeName="Name",
placeId="11",
placePrimaryImage="http://www.gettyimages.in/gi-resources/images/Embed/new/embed2.jpg",
.
.
.
Python 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 );
答案 0 :(得分:1)
您收到的是字符串,是否 ntohl 导致异常? 您可以使用 struct 模块解压 - 为16个字节
struct.unpack('!4I', data)
含义 - 按网络顺序解压缩4个无符号32位整数
(我无法测试它 - 自己试试)
编辑: 哎呀,没看过你的评论。根据{{3}}, recv 应返回 bytes 类型的对象。如果它返回 str 类型的对象 - 你应该将它转换为 bytes - 在Python3中它将是 data.encode()
PS你在哪个Python?
答案 1 :(得分:-1)
你说你已经设法通过连接发送字符串。我假设您发送了一个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+...
同样,如果endianess不同,元素的顺序也会改变。基本上bytes
上的索引将从i*4+3
变为i*4+0
。