Python socket:无法接收int数组

问题描述 投票:-1回答:2

我尝试通过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)
python c sockets typeerror htonl
2个回答
1
投票

你收到的是字符串,没有ntohl引起异常?您可以使用struct module来解压缩 - 包含16个字节

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

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

RTM

(我无法测试它 - 自己尝试)

编辑:哎呀,没看过你的评论。根据sockets docs,recv应返回字节类型的对象。如果它返回str类型的对象 - 你应该将它转换为字节 - 在Python3中它将是data.encode()

PS你在哪个Python?


-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+...

类似地,如果结束性不同,则元素的顺序将改变。基本上bytes的指数将从i*4+3i*4+0

© www.soinside.com 2019 - 2024. All rights reserved.