как добавить беззнаковый короткий символьный буферный массив, содержащий шестнадцатеричный байт

Я пытаюсь вычислить CRC 2 байта.
У меня есть таблица значений CRC для старшего байта и младшего байта.

static unsigned char auchCRCHi[] = {0x00, 0xC1, 0x81, 0x40, 0x01............0x40} ;
static char auchCRCLo[] = {0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03....0x40} ;

Они используются в функции ниже для вычисления CRC.

unsigned short CRC16(unsigned char* puchMsg, unsigned short usDataLen)
{
unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized */
unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */
unsigned uIndex ; /* will index into CRC lookup table */

while (usDataLen--) /* pass through message buffer */
{
uIndex = uchCRCHi ^ *puchMsg++ ; /* calculate the CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}

return (uchCRCHi << 8 | uchCRCLo) ;
}

В приведенной выше функции «puchMsg» есть указатель на буфер сообщений, содержащий
двоичные данные, которые будут использоваться для генерации CRC, а «usDataLen» — это количество байтов в буфере сообщений.

Функция возвращает CRC как тип unsigned short.

Теперь я должен добавить этот байт CRC в конце моего сообщения.

Без CRC, когда я отправляю свои данные следующим образом, это работает

char str[6]={0x01,0x01,0x00,0x01,0x00,0x20};// sending hex of $$S??
serialObj.send(str, 6);

Теперь я должен вычислить CRC и добавить его в конце строки, сделав его 8 байтов.

unsigned char str1[8] ={0x01,0x01,0x00,0x01,0x00, 0x20};
unsigned char* str2 = str1;
unsigned short test;
test= CRC16(str1,8);

здесь test будет содержать возвращенный CRC как unsigned short. Как добавить это как последние 2 байта в str1 [8].

0

Решение

Это довольно просто, один из примеров:

unsigned char buffer[8] ={0x01, 0x01, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00};
unsigned short crc = CRC16(buffer, 8); // Calculates the CRC16 of all 8 bytes
buffer[6] = ((char*) &crc)[0];
buffer[7] = ((char*) &crc)[1];

Это зависит от порядка следования байтов в системе назначения, вы можете поменять 0 на 1 выше.

Редактировать: Альтернатива:

*((unsigned short*) &buffer[6]) = crc;
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector