2013-03-21 30 views
0

我有一個tcp客戶端從服務器獲取數據作爲stringstream。服務器將向量(浮點數)打包成一個大字符串,並用標誌分隔這些向量(浮點數)。現在在我的客戶端中,我再次分離這些標誌,並將它們存儲在一個字符串數組中。所以每個「令牌」應該是一個向量。 但我只是不能解析它。我得到的字符串看起來很奇怪,看看:enter image description here使用stringstream,我如何解析這些字符串?

所以我需要做的就是解析它回到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) 

我收到一個異常。 enter image description here

回答

2

那麼字符串看起來很好,你只需要明白,當你重新解釋爲字符數組漂浮,你不會得到一個人類可讀的東西。你可以看看這裏,看看花車表示爲二進制:Floating points tutorial

所以,如果你有浮動1.01你會得到二進制00111111100000010100011110101110這是十六進制0x3f8147ae如果你看看在ASCII表的每一個字節了,你會看到那些字節看起來很垃圾。

所以到你的問題:如果你看here你會看到每個浮點數是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

+0

感謝你的幫助,我編輯的問題,瞭解更多詳情。當我嘗試像你說的那樣做時,我得到一個異常。 「在0x013007BB未處理的異常」...任何想法? – 2013-03-21 09:51:46

+0

什麼樣的數據類型是'tokens'?試試:'std :: string test = tokens;'如果標記已經是一個字符串。或者'std :: string test = tokens.str()'如果標記是一個字符串流。 – RedX 2013-03-21 10:42:49

+0

啊對不起。令牌是std :: vector 令牌;它由串流 – 2013-03-21 10:46:13