0

我有一个 tcp 客户端,它从服务器获取数据作为字符串流。服务器将向量(浮点数)打包成一个大字符串,并用标志分隔它们。现在在我的客户端中,我再次分离这些标志,并将它们存储在一个字符串数组中。所以每个“令牌”应该是一个向量。但我只是无法解析它。我得到的字符串看起来很奇怪,看看:在此处输入图像描述

因此,我需要做的就是将其解析回 3 个浮点数。在服务器端它是这样发送的:

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)

我有一个例外。 在此处输入图像描述

4

1 回答 1

2

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

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

所以对于你的问题:如果你看这里,你会看到每个浮点数是 4 个字节。

所以假设你有一个 12 字节的字符串(你应该这样做),你应该意识到那里有 3 个浮点数。要取出它们,一次获取 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

于 2013-03-21T09:38:05.457 回答