c++ - 使用 stringstream,我如何解析这些字符串?

标签 c++ parsing tcp

我有一个 tcp 客户端,它以字符串流的形式从服务器获取数据。服务器将 vector ( float )打包在一个大字符串中,并用标志将它们分开。现在在我的客户端中,我再次将这些标志分开,并将它们存储在一个字符串数组中。所以每个“ token ”应该是一个 vector 。 但我无法解析它。我得到的字符串看起来很奇怪,看看:enter image description here

所以,我需要做的就是将其解析回 3 个 float 。在服务器端,它是这样发送的:

data.addFlag(11);
data << pelvis.x() << pelvis.y() << pelvis.z();
data.addFlag(12);
data << rhip.x() << rhip.y() << rhip.z();

运算符重载为

operator<<(const float& f)
{
m_buf.append(reinterpret_cast<const char*>(&f), sizeof(f));
return *this;
}

编辑:

一个标记看起来像这样:如果我尝试通过以下方式解析它

float first = *reinterpret_cast<float*>(value)

我得到一个异常(exception)。 enter image description here

最佳答案

好吧,字符串看起来不错,您只需要了解,当您将 float 重新解释为字符数组时,您将无法获得人类可读的内容。您可以在这里查看 float 如何表示为二进制:Floating points tutorial

因此,如果你有 float 1.01,你将得到二进制 00111111100000010100011110101110,它是十六进制的 0x3f8147ae,如果你在 ascii 表中查找每个字节,你会发现这些字节可能看起来是垃圾。

那么对于你的问题:如果你看here你会看到每个 float 都是 4 个字节。

因此假设您有一个 12 字节的字符串(您应该这样做),您应该意识到其中有 3 个 float 。要将它们取出来,一次获取 4 个字节并重新解释它们

(未经测试的代码)

string data = (however you got the data)
float first = *reinterpret_cast<float*>(&data[0]);
float second = *reinterpret_cast<float*>(&data[4]);
float third = *reinterpret_cast<float*>(&data[8]);

就是这样。

编辑:看来我忘记取消引用指针了。

有关工作示例,请参见此处:

http://ideone.com/FLce6y

关于c++ - 使用 stringstream,我如何解析这些字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15543577/

相关文章:

c++ - 获取当前进程中加载​​的 DLL 列表及其引用计数

Json.Net 反序列化,保持一些属性未序列化

c# - 在 C# 中解析 PowerShell 输出

java - java servlet如何确认客户端收到响应

c# - Stream.Copy 是否通过管道传输?

c++ - 相同的地址被存储在链表的头部

c++ - 从 C# 使用 C++ DLL 时出现 AccessViolationException

c++ - 关闭 fstream 以便可以在代码中进一步编辑文件

c++ - 用于解析 C++ 中重复日期描述的库?

c# - Topshelf 服务(充当 TCP 服务器)与自托管 OWIN WebAPI 之间的通信