Преобразование алгоритма контрольной суммы из Python в C - PullRequest
0 голосов
/ 28 мая 2018

Для сетей в некоторых автомобилях 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;
}

1 Ответ

0 голосов
/ 28 мая 2018

Нет, проблема в модуле.Python следует за знаком правого операнда, а C следует за знаком левого.Вместо этого используйте маску с 0x0f, чтобы избежать этого.

result = 8 - result;
result &= 0x0f;
...