2012-03-29 2 views
1

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

Мне нужно отправить буфер типа «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?

ответ

3

Это:

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]; 
+0

Или 'буфер [0] = DLEN [0]; buffer [1] = CMD [0]; std :: copy (начало (данные), конец (данные), буфер + размер DLEN + размер CMD); std :: copy (begin (CRC), end (CRC), buffer + sizeof DLEN + sizeof CMD + sizeof data); '(разбивается на отдельные строки, конечно) – bames53

0

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

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

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

+0

Это не сработает. Все типы - это массивы символов. Вы не можете смещать массив. – bames53

1

Альтернативное решение заключается в следующем:

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

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

0

Моя версия ответа 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); 
Смежные вопросы