Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将多个变量打包为一个字符串_C++ - Fatal编程技术网

C++ 将多个变量打包为一个字符串

C++ 将多个变量打包为一个字符串,c++,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看起来不像是一个可行的

字符流被发送到通信设备。为了便于阅读,我在个人配置中编写了变量:

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不包含字符串,而且字符串的大小是变化的,尽管它是一次性声明的东西。用GCC编译

edit2:将使用压缩结构方法,但将首先将字符串转换为c_str。在找到更好的答案之前,这是最好的方法。

a,而不仅仅是一个结构更合适

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

A,而不仅仅是一个结构更合适

编辑:当然,你们不应该使用字符串作为你们的结构的一部分,它跳过了我的回答,但正如其他人所指出的。您应该使用str.c_str将字符串转换为字符数组;然后将其存储在压缩结构中。

一个简单的无符号字符数组就足够了。但是struct是更好的方法

顺便说一句,我认为您不能在结构中使用std::string。这里需要一个无符号字符数组。

一个简单的无符号字符数组就足够了。但是struct是更好的方法


顺便说一句,我认为您不能在结构中使用std::string。您需要一个无符号字符数组。

您真的要将std::string发送到设备吗?字符串没有固定的大小。您应该使用a6.c_str,并使用一个无符号字符数组及其大小发送all?

您真的要将std::string发送到设备吗?字符串没有固定的大小。您应该使用a6.c_str,并使用一个无符号字符数组及其大小发送all

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

} __attribute__((packed));
特定于GCC。阅读:还可以查看aligned variable属性

或者手动插入伪变量以填充编译器可能引入填充的位置

特定于GCC。阅读:还可以查看aligned variable属性


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

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

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

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

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

如果要发送std::string之类的对象,则需要使用某种序列化和/或协议。“原始”字符串对象通常包含一个指向实际字符串数据的指针,而该指针在链接的另一端将没有意义。更不用说指针指向的数据在没有某种序列化的情况下是不会被发送的,并且处理std::string表示的可变长度数据需要某种协议


我认为你可以考虑的不仅仅是把东西包装得很紧。

如果你想发送一个像STD::string那样的对象,你需要使用某种序列化和/或协议。“原始”字符串对象通常包含一个指向实际字符串数据的指针,而该指针在链接的另一端将没有意义。更不用说指针指向的数据在没有某种序列化的情况下是不会被发送的,并且处理std::string表示的可变长度数据需要某种协议


我认为你可以考虑的不仅仅是把东西包装得很紧。

虽然已经有一个正确的答案:你使用的是哪种编译器?遗憾的是,打包是特定于编译器的。感谢您提醒我们有关编译器的详细信息,因为已经有了正确的答案:您正在使用哪些编译器?很遗憾,打包是特定于编译器的。感谢您提醒有关编译器详细信息。。。字符串应该是一个字符数组。很抱歉。。。字符串应该是一个字符数组。很抱歉,我想通过一次做两件事来减少一些处理时间。我想通过一次做两件事来减少一些处理时间。谢谢你的帮助,但我想其他一些人已经指出,字符串必须首先在c_str中。@freonix。防御它必须是c字符串。对于cpp字符串,您不知道其内部结构,直接将其发送到设备是不合适的。谢谢您的帮助,但我想其他人已经指出,字符串必须先在c_str中。@freonix。防御它必须是c字符串。对于cpp字符串,您不知道其内部结构,直接将其发送到设备是不合适的。是的,也是这样,但我打算
同时做两件事,努力追求速度。做一个序列化似乎要拖更多的时间,但当然,它更安全。是的,那也是,但我打算同时做两件事,努力提高速度。进行序列化似乎会拖更长的时间,但当然,它更安全。