2011-05-18 39 views
1

將一串字符發送到通信設備。爲了提高可讀性,我寫inidividual配置變量:將多個變量包裝成一個字符串

unsigned char a1; 
unsigned char a2; 
unsigned char a3; 
unsigned char a4; 
unsigned char a5; 
std::string a6; 
unsigned char a7; 
unsigned char a8; 

是什麼使這是完全一致將其打包成一個變量緊密的最好方法?直到現在我已經想到把所有東西都放進struct

編輯struct看起來不像,因爲struct一個可行的選擇不持有string,並且字符串大小不同,雖然是一次性申報的事情。編譯GCC

EDIT2:要去與填充struct方法,但將string轉換爲c_str第一。直到一個更好的答案,這是一個方法。

+0

雖然已經有一個正確的答案:您使用哪個編譯器?不幸的是,打包是特定於編譯器的。 – OregonGhost 2011-05-18 08:14:49

+0

感謝您提供關於編譯器的詳細信息 – freonix 2011-05-18 08:41:47

回答

3

一個packed structure,而不僅僅是一個結構會更合適。

編輯:當然,你不應該使用string作爲你的結構的一部分,它在回答時忽略了我,但正如其他人指出的那樣。您應該使用str.c_str());string轉換爲字符數組,然後將其存儲在打包結構中。

+0

感謝您的幫助,但我認爲其他人已經指出該字符串必須先在c_str中。 – freonix 2011-05-18 08:44:26

+0

@freonix。有保證它必須是C字符串。對於cpp字符串,您不知道內部結構,並且將它直接發送到設備是不合適的。 – phoxis 2011-05-18 08:48:41

0

一個簡單的unsigned char數組應該就夠了。但struct是更好的方式。

順便說一句,我不認爲你可以在struct中使用std::string。那裏你需要數組unsigned char

1

你真的想發送std :: string到設備?字符串沒有固定的大小。你應該使用a6.c_str(),併發送一個無符號字符數組的大小和它的大小?

+0

嗯...該字符串應該是一個字符數組。謝謝你回覆 – freonix 2011-05-18 08:35:31

0

我不知道如果這是你的要求,但你可以使用std :: ostringstream類所有變量的合併在一個單一的字符串:

std::ostringstream sOutStream; 
sOutStream << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8; 
std::string sOutput = sOutStream.str(); 
+0

是的,那也是,但我打算一次做兩件事,試圖加快速度。做序列化似乎拖了更多時間,但當然更安全。 – freonix 2011-05-18 08:45:44

0

如果你要發送的物體,像std::string你需要使用某種序列化和/或協議。 'raw'字符串對象通常會包含一個指向實際字符串數據的指針 - 並且該指針在鏈接的另一端將沒有意義。沒有提到指針指向的數據將不會被髮送(沒有某種序列化),並且需要某種協議來處理由std::string表示的可變長度數據。

我想你可能有更多的考慮,而不是隻是緊緊地包裝東西。

+0

我正在尋求更簡單的方法,試圖通過一次完成兩件事來縮短一些處理時間。 – freonix 2011-05-18 08:39:28

相關問題