конкатенация без знака - PullRequest
1 голос
/ 29 марта 2012

Я создаю программу на C ++ для связи с захватом через последовательный порт.

Мне нужно отправить буфер типа "unsigned char [8]", но из этих 8 байтов 4 вводятся с клавиатуры, а 2 - это CRC, рассчитанный в то время.

Итак, как мне объединить несколько частей в одном буфере 8-байтового беззнакового символа?

Например:

unsigned char buffer[8];
----
unsigned char DLEN[1]={0x05};
----
unsigned char CMD[1]={0x01};
----
unsigned char data[4]={0x00,0x01,0x20,0x41};
----
unsigned char CRC[2]={0xFF,0x41};
----

как мне получить этот буфер: {0x05,0x01,0x00,0x01,0x20,0x41,0xFF,0x41}, который является объединением DLEN, CMD, data и CRC?

Ответы [ 4 ]

3 голосов
/ 29 марта 2012

Это:

buffer[0] = DLEN[0];
buffer[1] = CMD[0];
buffer[2] = data[0];
buffer[3] = data[1];
buffer[4] = data[2];
buffer[5] = data[3];
buffer[6] = CRC[0];
buffer[7] = CRC[1];
1 голос
/ 29 марта 2012

Альтернативное решение:

Начните с массива символов без знака из 8 символов.

Когда вам нужно передать его другим методам, чтобы в него были вставлены данные, передайте его по ссылке следующим образом: updateCRC(&buffer[6]) с сигнатурой метода, принимающей беззнаковый указатель на символ. Предполагая, что вы соблюдаете соответствующие размеры входных данных, результат является лучшим из обоих миров, обрабатывая буфер, как если бы они были отдельными строками, и не нужно впоследствии объединять его в один массив.

0 голосов
/ 29 марта 2012

Моя версия ответа hmjd:

buffer[0] = DLEN[0];
buffer[1] = CMD[0];
std::copy(begin(data),end(data),buffer+sizeof DLEN+sizeof CMD);
std::copy(begin(CRC) ,end(CRC) ,buffer+sizeof DLEN+sizeof CMD+sizeof data);
0 голосов
/ 29 марта 2012

Вы можете использовать битовое смещение, операторы << и >>, чтобы получить соответствующие поля в нужных местах в буфере.

Что-то вроде buffer |= (DLEN << 7);

Просто убедитесь, что ваш буфер очищен, чтобы быть первым со всеми 0.

...