将多个变量打包成一个字符串

时间:2011-05-18 08:11:05

标签: c++

将字符流发送到通信设备。出于可读性目的,我将个体配置写为变量:

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。在得到更好的答案之前,这是可行的方法。

6 个答案:

答案 0 :(得分:3)

packed structure ,而不仅仅是一种结构更合适。

编辑:当然,你不应该使用string作为你的结构的一部分,它在回答时跳过了我,但正如其他人所指出的那样。您应该使用stringstr.c_str());转换为字符数组,然后将其存储在打包结构中。

答案 1 :(得分:1)

您真的想将std :: string发送给设备吗?字符串没有固定的大小。你应该使用a6.c_str(),并使用unsigned char数组发送all并且它的大小是什么?

答案 2 :(得分:1)

struct foo {
   unsigned char a1;
   unsigned char a2;
   unsigned char a3;
   unsigned char a4;
   unsigned char a5;
   .
   .
   .

} __attribute__((packed));

GCC具体。阅读:http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes另请参阅aligned变量属性

或手动插入虚拟变量以填充编译器可能引入填充的位置。

答案 3 :(得分:0)

一个简单的unsigned char数组就足够了。但struct是更好的方式。

顺便说一下,我认为你不能在std::string中使用struct。你需要unsigned char数组。

答案 4 :(得分:0)

我不确定这是否是您的请求,但您可以使用std :: ostringstream类将所有变量合并到一个字符串中:

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

答案 5 :(得分:0)

如果要发送像std::string这样的对象,则需要使用某种序列化和/或协议。 'raw'字符串对象通常包含指向实际字符串数据的指针 - 该指针在链接的另一端无意义。没有提到指针指向的数据将不会被发送(没有某种序列化),并且需要某种协议来处理std::string表示的可变长度数据。

我认为你可能需要考虑的不仅仅是把事情紧紧包装好。