C ++ wxsocket TCP服务器发送无符号字符数组但python客户端获得4个字节

Posted

技术标签:

【中文标题】C ++ wxsocket TCP服务器发送无符号字符数组但python客户端获得4个字节【英文标题】:C++ wxsocket TCP server send unsigned char array but python client get 4 more bytes in 【发布时间】:2015-06-18 07:43:56 【问题描述】:

您好,我使用 C++ TCP 套接字向 python TCP 客户端发送了一个 wxImage,如下所示:

C++ TCP Server 是这样的:

//this part is the TCP server m_sock send the unsigned char* ImageData
std::stringstream imageStream1;
imageStream1 << ImageData;
m_sock->Write(imageStream1.str().c_str(), imageStream1.str().length());

//Then I send a simple string "hello"
std::stringstream dataStream2;
dataStream2 <<  "hello";
m_sock->Write(dataStream2.str().c_str(), dataStream2.str().length());
dataStream2.clear();

所以我在 python 中收到了两条消息

// This is used to receive the image data with the exact same bytes of the ImageData
packet = socket.recv(ImageDataSize)
myWxImage.SetData(packet)

// This is used to receive the second "hello" message
packet = socket.recv(1000)

我可以成功接收到图像。但是当我打印消息时,它显示“****hello”而不是“hello”。它前面还有一个额外的 4 字节字符串。四个“*”是python无法打印出来的东西。它是什么?我可以摆脱它吗?

【问题讨论】:

【参考方案1】:
std::stringstream imageStream1;
imageStream1 << ImageData;
m_sock->Write(imageStream1.str().c_str(), imageStream1.str().length());

看起来是个坏主意。我不知道 ImageData 的类型,但将其转换为 std::stringstream 绝对不是解决此问题的最佳方法。如果ImageData 只包含对原始图像缓冲区的引用,请使用它。图像不是字符串,显然,如果您从数据中可能包含 \x00 的东西中获取 c_str(),事情就会出错(因为这通常会终止 C 字符串)。

然后:

//Then I send a simple string "hello"
std::stringstream dataStream2;
dataStream2 <<  "hello";
m_sock->Write(dataStream2.str().c_str(), dataStream2.str().length());
dataStream2.clear();

嗯,你明白你在写什么吗?你把一个完全有效的 C 字符串 "hello" 推到一个字符串流上,只是为了再次取出一个 C 字符串?

说实话:我认为您是在不理解示例的情况下复制和粘贴代码。你应该在使用前回过头来了解每一行。

【讨论】:

仅仅因为示例简单并不一定意味着发布者不知道他们在做什么。毕竟,我们鼓励创建MCVE【参考方案2】:

如何去掉“****”

一般来说,只需从 python 字符串中删除字符,您可以这样做:

cleaned_data = str(packet).replace("*", "")

请记住,当您在packet 中接收数据时,您接收的是字节而不是字符串,因此如果您尝试直接打印,python 会为您进行隐式转换。在这种情况下,我认为最好进行显式转换并删除开头。

但是,它并不能解决您为什么首先要获取字符的问题。这 4 个“*”可能源于编码问题。

疑难解答

将python程序连接到调试器(可能是PyCharm)是值得的,这样你就可以看到“Hello”之前的实际值,这会让你知道在哪里看,这样你就没有处理从字节到 unicode 或控制台所在的任何语言环境的转换。

如果您能获得并发布该信息,它可能会帮助其他人帮助您。

【讨论】:

以上是关于C ++ wxsocket TCP服务器发送无符号字符数组但python客户端获得4个字节的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP协议 怎么用JAVA发送和接收二进制数据 要具体实例

c socket

使用Boost序列化和发送数据结构?

在C中将无符号短数组转换为字节数组

TCP,HTTP,socket,WEBSOCKET协议

开放连接上的无连接 UDP 与面向连接的 TCP