0

サーバーからデータを文字列ストリームとして取得するtcpクライアントがあります。サーバーはベクトル (フロート) を 1 つの大きな文字列にパックし、これらをフラグで区切ります。私のクライアントでは、これらのフラグを再び分離し、文字列配列に格納します。したがって、各「トークン」は 1 つのベクトルである必要があります。しかし、私はそれを解析することはできません。私が得た文字列は非常に奇妙に見えます。見てください:ここに画像の説明を入力

繰り返しますが、これを解析して 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;
}

編集:

1 つのトークンは次のようになります。

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

私は例外を取得します。 ここに画像の説明を入力

4

1 に答える 1

2

float を char 配列として再解釈すると、人間が読めるものが得られないことを理解する必要があります。フロートがバイナリとしてどのように表現されるかについては、こちらを参照してください:浮動小数点のチュートリアル

したがって、float 1.01 がある場合、バイナリ 00111111100000010100011110101110 が得られます。これは 16 進数の 0x3f8147ae であり、ASCII テーブルですべてのバイトを調べると、それらのバイトがゴミのように見えることがわかります。

だからあなたの問題:ここを見ると、各フロートが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

于 2013-03-21T09:38:05.457 に答える