将字符流发送到通信设备。出于可读性目的,我将个体配置写为变量:
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 :(得分:3)
packed structure ,而不仅仅是一种结构更合适。
编辑:当然,你不应该使用string
作为你的结构的一部分,它在回答时跳过了我,但正如其他人所指出的那样。您应该使用string
将str.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
表示的可变长度数据。
我认为你可能需要考虑的不仅仅是把事情紧紧包装好。