DEC перевести в HEX и засунуть в массив

tERBO
Offline
Зарегистрирован: 11.12.2012

Всем привет!

Есть задачка "собрать" строчку из 16 байт и отправить её дальше по i2c шине другому устройству.

У этой строчки последние два байта это контрольная сумма crc16 предыдущих 14 байт.

Объявляю массив:

uint16_t line1[] = {0x42, 0x2C, 0x20, 0x00, 0x03, 0x03, 0x92, 0x25, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

При помощи такой функции считаю контрольную сумму:

static uint16_t Crc16(uint16_t *data, size_t len) { 
  uint16_t crc = 0x0000; 
  size_t j; 
  int i; 
  for (j=len; j>0; j--) { 
    crc ^= *data++; 
    for (i=0; i<8; i++) { 
      if (crc & 1) crc = (crc >> 1) ^ 0xA001; 
      else crc >>= 1; 
    } 
  } 
  return (crc); 
}

На выходе получаю число 44730, что в HEX-е будет AEBA. Теперь как-то нужно эти два байта запихнуть в конец массива. Что-то типа:

a = 0xAE;
b = 0xBA;
line[14] = b;
line[15] = a;

Конечно есть готовые библиотеки, которые из DEC-а в HEX переводят и CRC считают сразу давая на выходе HEX. Но т.к. это МК, у которого мало памяти, всё это громоздить не желательно - нужно простое и элегантное решение.

Т.к. знаний и опыта у меня мало - с ходу решить эту задачку не вышло. По этому прошу совета у бывалых. Заранее спасибо!

vk007
Offline
Зарегистрирован: 16.06.2015

Чтобы разбить число на байты пользуйтесь lowByte() и highByte(). Что-то типа:

line[14] = lowByte(crc);
line[15] = highByte(crc);

 

tERBO
Offline
Зарегистрирован: 11.12.2012

Спасибо - всё работает! Как раз то, что я искал - простое и элегантное решение :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Что самое интересное, что ни hex, ни dec здесь вообще не нужны.

tERBO
Offline
Зарегистрирован: 11.12.2012

Да понятно что всё хранится и обрабатывается в бинарном виде, просто в определённых местах этой строки будут вносится изменения и удобнее всего её представлять в шестнадцатеричном виде.

Антиоффтопик: С байтами разобрались, а никто не подскажет как отбросить старший или младший ниббл? Например из 422С20 нужно получить 22С2, прибавить единицу (например), получив 22C3, прилепить обратно 4 и 0 и записать 422C30 в массив.

Или такой массив изначально не самый подходящий способ хранения данных для подобных задач и нужно использовать что-то другое?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Битовыми операциями по маске.

По сути, любое число - это тоже битовый массив, но в большинстве случаев удобнее работать с ним как с единым объектом, а не разделяя его на отдельные биты.