Упаковка нескольких переменных в одну строку

Поток символов отправляется на устройство связи. Для удобства чтения я написал отдельные конфигурации в виде переменных:

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 ответов

Решение

Упакованная структура, а не просто структура была бы более подходящей.

РЕДАКТИРОВАТЬ: Конечно, вы не должны использовать string как часть вашей структуры, Он пропустил меня, отвечая, но, как уже отмечали другие. Вы должны обратить string в массив символов с помощью str.c_str()); и затем сохраните то же самое в упакованной структуре.

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 Также посмотрите на aligned атрибут переменной

Или вручную вставьте фиктивные переменные, чтобы заполнить места, где компилятор может вводить отступы.

Вы действительно хотите отправить std::string на устройство? Строка не имеет фиксированного размера. Вы должны использовать a6.c_str() и отправить все с массивом без знака и его размером?

Я не уверен, что это ваш запрос, но вы можете использовать класс std::ostringstream, чтобы объединить все переменные в одну строку:

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

Простой массив unsigned char должно быть достаточно. Но struct это лучший способ, хотя.

Кстати, я не думаю, что вы можете использовать std::string в struct, Вам нужен массив unsigned char там.

Если вы хотите отправить объект как std::string вам нужно будет использовать какую-то сериализацию и / или протокол. "Необработанный" строковый объект будет обычно содержать указатель на фактические строковые данные - и этот указатель будет бессмысленным на другом конце ссылки. Не говоря уже о том, что данные, на которые указывает указатель, не будут отправлены (без какой-либо сериализации) и что для обработки данных переменной длины, которые std::string представляет собой.

Я думаю, у вас может быть больше, чем просто плотно упаковывать вещи.

Другие вопросы по тегам