我已经在 C++ 程序和 Python 脚本之间建立了一个套接字。这一切都非常简单,我想以大约 20 Hz 的频率从 C 程序向 Python 发送坐标。这只是第一次尝试,我想发送一组坐标,它看起来像这样:
C++程序,服务器:
struct coord {
int x;
int y;
int z;
};
struct coord co;
co.x = 1;
co.y = 2;
co.z = 3;
char *msg;
msg = (char*) &co;
send(newsockfd, msg,strlen((char*) &co), 0);
这是重要的部分,在此之前我已经成功地初始化了一个具有特定地址的套接字。现在我想将这三个坐标发送给python程序。我将地址发送到第一个整数 (co.x),以及分配的内存,它应该是 12 个字节。
这是 python 脚本。同样,我只包含了重要的内容。
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect(server_address)
recvInt = sock.recv(4096)
现在我想访问前 4 个字节并将其存储在一个变量中,接下来的 4 个字节存储在一个单独的变量中,最后 4 个字节存储在第三个变量中。但是我该怎么做呢? recvInt 似乎是无用的对象字节,我还没有设法将它转换成任何东西,打印输出也没有任何意义。有人可以帮助我或指出正确的方向吗?
编辑:当我打印输出时:type(recvInt) 它说它是一个 str。考虑到函数 socket.recv() 的文档明确指出它返回一个字节,这也很奇怪。但是,现在我还找到了该函数应返回数据的字符串表示形式的文档。哪个是对的?这个假定的字符串表示只是一个有四位数字的小盒子,看起来像一个字节的视觉表示。然而 msg 包含 12 个字节,并且 recvInt 上没有索引。 谢谢
最佳答案
看看 struct python 库。
基本上,对于您的情况,类似以下的内容可能会起作用。
import struct
x, y, z = struct.unpack("!iii", receivedData)
以上代码会将接收到的字符串解析为3个有符号整数。
socket.recv
返回一个二进制字符串,它本质上是一个字节数组。 Python 没有为 recvInt 或 parseInt 提供单独的函数,而是提供了一个库来将任意二进制字符串解析为不同大小的整数或字符串。
关于Python socket 接收和存储数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25406074/