通过套接字在 C++ 和 python 之间交换固定浮点数组

Posted

技术标签:

【中文标题】通过套接字在 C++ 和 python 之间交换固定浮点数组【英文标题】:Exchange fixed float array between C++ and python through socket 【发布时间】:2017-03-05 15:18:53 【问题描述】:

我正在尝试使用 C++ 发送一个固定长度的浮点数组 并使用python获取它

这是我的 C++ 客户端,其中 sConnect 是一个 SOCKET 对象

    float news[2];
    news[0] = 1.2;
    news[1] = 2.56;
    char const * p = reinterpret_cast<char const *>(news);
    std::string s(p, p + sizeof news);
    send(sConnect, &s[0], sizeof(news), 0);

在 python 服务器上 我的代码是这样的

import socketserver


class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):

    self.data = self.request.recv(8).strip()
    print (self.data)

if __name__ == "__main__":
   HOST, PORT = "127.0.0.1", 9999
   print("listening")
   server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
   server.serve_forever()

而我在python得到的数据是这样的

b'\x9a\x99\x99?\n\xd7#@'

如何将其恢复为我发送的原始浮点数据? 或者有没有更好的方式来发送和接收数据?

【问题讨论】:

【参考方案1】:

你可以使用struct模块来解压字节数据。

import struct
news = struct.unpack('ff', b'\x9a\x99\x99?\n\xd7#@')
print(news)

使用您的代码:

import struct
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(8).strip()
        news = struct.unpack('ff', self.data)
        print(news)

struct.unpack 的第一个参数“ff”是指定数据预期布局的格式字符串,在本例中为 2 个浮点数。其他格式字符见https://docs.python.org/3/library/struct.html

【讨论】:

以上是关于通过套接字在 C++ 和 python 之间交换固定浮点数组的主要内容,如果未能解决你的问题,请参考以下文章

C++ 应用程序 (Sci)Python 之间的数据交换

如何在 c++ 和 java 之间通过 udp 有效发送数据数组

提升套接字通信无法通过一次交换

多个客户端套接字到单个服务器 C++

Python爬虫第二课 网络编程基础

Python爬虫第二课 网络编程基础