diff --git a/src/knx/bau_systemB_device.cpp b/src/knx/bau_systemB_device.cpp index 468137c..3ee4425 100644 --- a/src/knx/bau_systemB_device.cpp +++ b/src/knx/bau_systemB_device.cpp @@ -23,9 +23,9 @@ BauSystemBDevice::BauSystemBDevice(Platform& platform) : _transLayer.groupAddressTable(_addrTable); _memory.addSaveRestore(&_deviceObj); + _memory.addSaveRestore(&_groupObjTable); // changed order for better memory management _memory.addSaveRestore(&_addrTable); _memory.addSaveRestore(&_assocTable); - _memory.addSaveRestore(&_groupObjTable); #ifdef USE_DATASECURE _memory.addSaveRestore(&_secIfObj); #endif diff --git a/src/knx/bits.cpp b/src/knx/bits.cpp index 9b04145..d69f17d 100644 --- a/src/knx/bits.cpp +++ b/src/knx/bits.cpp @@ -124,21 +124,19 @@ uint64_t sixBytesToUInt64(uint8_t* data) uint16_t crc16Ccitt(uint8_t* input, uint16_t length) { - uint32_t polynom = 0x1021; - uint8_t padded[length+2]; + uint32_t polynom = 0x1021; - memcpy(padded, input, length); - memset(padded+length, 0x00, 2); - - uint32_t result = 0xffff; - for (uint32_t i = 0; i < 8 * (uint32_t)sizeof(padded); i++) { - result <<= 1; - uint32_t nextBit = (padded[i / 8] >> (7 - (i % 8))) & 0x1; - result |= nextBit; - if ((result & 0x10000) != 0) - result ^= polynom; - } - return result & 0xffff; + uint32_t result = 0xffff; + for (uint32_t i = 0; i < 8 * ((uint32_t)length + 2); i++) + { + result <<= 1; + uint32_t nextBit; + nextBit = ((i / 8) < length) ? ((input[i / 8] >> (7 - (i % 8))) & 0x1) : 0; + result |= nextBit; + if ((result & 0x10000) != 0) + result ^= polynom; + } + return result & 0xffff; } uint16_t crc16Dnp(uint8_t* input, uint16_t length)