Упаковка нескольких переменных в одну строку
Поток символов отправляется на устройство связи. Для удобства чтения я написал отдельные конфигурации в виде переменных:
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
представляет собой.
Я думаю, у вас может быть больше, чем просто плотно упаковывать вещи.