DEC перевести в HEX и засунуть в массив
- Войдите на сайт для отправки комментариев
Всем привет!
Есть задачка "собрать" строчку из 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. Но т.к. это МК, у которого мало памяти, всё это громоздить не желательно - нужно простое и элегантное решение.
Т.к. знаний и опыта у меня мало - с ходу решить эту задачку не вышло. По этому прошу совета у бывалых. Заранее спасибо!
Чтобы разбить число на байты пользуйтесь lowByte() и highByte(). Что-то типа:
Спасибо - всё работает! Как раз то, что я искал - простое и элегантное решение :)
Что самое интересное, что ни hex, ни dec здесь вообще не нужны.
Да понятно что всё хранится и обрабатывается в бинарном виде, просто в определённых местах этой строки будут вносится изменения и удобнее всего её представлять в шестнадцатеричном виде.
Антиоффтопик: С байтами разобрались, а никто не подскажет как отбросить старший или младший ниббл? Например из 422С20 нужно получить 22С2, прибавить единицу (например), получив 22C3, прилепить обратно 4 и 0 и записать 422C30 в массив.
Или такой массив изначально не самый подходящий способ хранения данных для подобных задач и нужно использовать что-то другое?
Битовыми операциями по маске.
По сути, любое число - это тоже битовый массив, но в большинстве случаев удобнее работать с ним как с единым объектом, а не разделяя его на отдельные биты.