-1

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

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

现在我想在 python 套接字中使用 ntohl() 但接收函数返回字节,而 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端(只是相关部分):

data = connection.recv(16)
data_i = socket.ntohl(data)
4

2 回答 2

1

你收到的是一串字节,ntohl没有引起异常吗?您可以使用struct模块解包 - 16 个字节

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

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

RTM

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

编辑:哎呀,没有阅读您的评论。根据套接字文档recv应该返回字节类型的对象。如果它返回str类型的对象-您应该将其转换为字节-在 Python3 中它将是data.encode()

PS你在哪个Python上?

于 2017-11-22T13:59:22.417 回答
-1

你说你已经设法通过连接发送字符串。我假设您发送 achar*并在 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

于 2017-11-22T13:51:52.463 回答