Для сетей в некоторых автомобилях Honda существует алгоритм контрольной суммы , который вычисляет целое число от 0 до 15 для предоставленных данных.Я пытаюсь преобразовать его в обычный C, но я думаю, что чего-то не хватает, так как я получаю разные результаты в своей реализации.
Хотя алгоритм Python вычисляет 6 для "ABC", мой вычисляет -10, что странно.Я что-то напутал со сдвигом битов?
Алгоритм Python:
def can_cksum(mm):
s = 0
for c in mm:
c = ord(c)
s += (c>>4)
s += c & 0xF
s = 8-s
s %= 0x10
return s
Моя версия на C:
int can_cksum(unsigned char * data, unsigned int len) {
int result = 0;
for (int i = 0; i < len; i++) {
result += data[i] >> 4;
result += data[i] & 0xF;
}
result = 8 - result;
result %= 0x10;
return result;
}