Упаковка нескольких переменных в одну строку - PullRequest
1 голос
/ 18 мая 2011

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

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.

edit : struct не выглядит приемлемым вариантом, так как struct не содержит string и строка различается по размеру, хотя это объявленная вещь.Скомпилировано в GCC

edit2 : собирается использовать упакованный метод struct, но сначала преобразует string в c_str.Пока лучший ответ, это способ быть.

Ответы [ 6 ]

3 голосов
/ 18 мая 2011

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

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

1 голос
/ 18 мая 2011
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 variable

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

1 голос
/ 18 мая 2011

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

0 голосов
/ 18 мая 2011

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

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

0 голосов
/ 18 мая 2011

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

std::ostringstream sOutStream;
sOutStream << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8;
std::string sOutput = sOutStream.str();
0 голосов
/ 18 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...