История изменений
Исправление aol, (текущая версия) :
CCITT
есть несколько вариаций:
case CCITT_0xFFFF:
return crc(nBytes, straight_8, straight_16, 0xffff, 0x1021);
case CCITT_0x0000_AKA_XMODEM:
return crc(nBytes, straight_8, straight_16, 0x0000, 0x1021);
case CCITT_KERMIT:
return crc(nBytes, reverse_8, reverse_16, 0xffff, 0x1021);
case CCIT_0x1D0F:
return crc(nBytes, straight_8, straight_16, 0x1d0f, 0x1021);
весь код привести не могу, вот куски, чтобы получилось рассчитать:
typedef uint8_t bit_order_8(uint8_t value);
typedef uint16_t bit_order_16(uint16_t value);
uint16_t straight_16(uint16_t value) {
return value;
}
uint16_t reverse_16(uint16_t value) {
uint16_t reversed = 0;
for (int i = 0; i < 16; ++i) {
reversed <<= 1;
reversed |= value & 0x1;
value >>= 1;
}
return reversed;
}
uint8_t straight_8(uint8_t value) {
return value;
}
uint8_t reverse_8(uint8_t value) {
uint8_t reversed = 0;
for (int i = 0; i < 8; ++i) {
reversed <<= 1;
reversed |= value & 0x1;
value >>= 1;
}
return reversed;
}
uint16_t crc(int nBytes, bit_order_8 dataBitOrder, bit_order_16 remainderBitOrder,
uint16_t initial, uint16_t polynomial) {
uint16_t crc = initial;
for (int byte = 0; byte < nBytes; byte++) {
crc ^= (dataBitOrder(rawBuffer[byte]) << 8);
for (uint8_t bit = 8; bit > 0; --bit) {
if (crc & 0x8000) {
crc = (crc << 1) ^ polynomial;
} else {
crc = (crc << 1);
}
}
}
return remainderBitOrder(crc);
}
//твою документацию я, естественно, не читал. :) в моем примере - nBytes
- размер данных, от которых надо посчитать КС, сами данные в rawBuffer
.
Исходная версия aol, :
CCITT
есть несколько вариаций:
case CCITT_0xFFFF:
return crc(nBytes, straight_8, straight_16, 0xffff, 0x1021);
case CCITT_0x0000_AKA_XMODEM:
return crc(nBytes, straight_8, straight_16, 0x0000, 0x1021);
case CCITT_KERMIT:
return crc(nBytes, reverse_8, reverse_16, 0xffff, 0x1021);
case CCIT_0x1D0F:
return crc(nBytes, straight_8, straight_16, 0x1d0f, 0x1021);
весь код привести не могу, вот куски, чтобы получилось рассчитать:
typedef uint8_t bit_order_8(uint8_t value);
typedef uint16_t bit_order_16(uint16_t value);
uint16_t straight_16(uint16_t value) {
return value;
}
uint16_t reverse_16(uint16_t value) {
uint16_t reversed = 0;
for (int i = 0; i < 16; ++i) {
reversed <<= 1;
reversed |= value & 0x1;
value >>= 1;
}
return reversed;
}
uint8_t straight_8(uint8_t value) {
return value;
}
uint8_t reverse_8(uint8_t value) {
uint8_t reversed = 0;
for (int i = 0; i < 8; ++i) {
reversed <<= 1;
reversed |= value & 0x1;
value >>= 1;
}
return reversed;
}
uint16_t crc(int nBytes, bit_order_8 dataBitOrder, bit_order_16 remainderBitOrder,
uint16_t initial, uint16_t polynomial) {
uint16_t crc = initial;
for (int byte = 0; byte < nBytes; byte++) {
crc ^= (dataBitOrder(rawBuffer[byte]) << 8);
for (uint8_t bit = 8; bit > 0; --bit) {
if (crc & 0x8000) {
crc = (crc << 1) ^ polynomial;
} else {
crc = (crc << 1);
}
}
}
return remainderBitOrder(crc);
}