将校验和算法从 Python 转换为 C

标签 c checksum

有一个checksum algorithm对于某些本田汽车中的网络,它会为提供的数据计算 0-15 之间的整数。我正在尝试将它转换为纯 C,但我认为我遗漏了一些东西,因为我在实现中得到了不同的结果。

虽然 Python 算法为“ABC”计算了 6,但我的算法计算了 -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;
}

最佳答案

不,问题是模数。 Python 遵循右操作数的符号,而 C 遵循左操作数的符号。改为使用 0x0f 掩码以避免这种情况。

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

关于将校验和算法从 Python 转换为 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50572124/

相关文章:

在C中将long转换为float

c - C 的 std::unordered_set(int) 容器库

java - NMEA校验和计算

java - 如何在 Maven 中创建校验和然后将其输出到文本文件?

python - 使用 MD5 校验和在多个硬盘驱动器上搜索重复文件是否安全?

c - C编程删除链表中的某个节点

c - 多线程 Linux 进程的地址空间布局

language-agnostic - 如何获得跨步模式的校验和

内核非对称加密中的 crypto_akcipher_set_pub_key 始终返回错误

C++ - 构造 ICMP 数据包时出现访问冲突