JavaScript 中的 CRC-CCITT(XModem)实现

问题描述 投票:0回答:2

我正在尝试在 javascript 中实施 CRC-CCITT (XModem) 检查但没有成功。 我需要它才能通过 RS232 将套接字字符串发送到控制器。 有谁知道该怎么做?或者也许某处有示例代码??

如果有任何帮助,我将不胜感激 :)

javascript crc xmodem
2个回答
1
投票

快速搜索显示 http://zorc.breitbandkatze.de/crc.html 这是一个在线的 Javascript CRC 计算器。它看起来很通用,因为所有 CRC 参数都可以更改,所以它可能比您要找的要多得多。但是,相同的技术将适用于您的应用程序。


0
投票

由于其相当独特的多项式,XMODEM 使用的 CRC-16 变体可以在具有最佳性能的 JavaScript 中高效实现。

此函数将生成给定字符串的XMODEM CRC-16

function crc16(str, crc = 0, xorout = 0) {
    for(let i = 0, t; i < str.length; i++, crc &= 0xFFFF) {
        t = (crc >> 8) ^ str.charCodeAt(i);
        t ^= t >> 4;
        crc = (crc << 8) ^ (t << 12) ^ (t << 5) ^ t;
    }
    return crc ^ xorout;
}

// Check if test string matches expected result
console.log(crc16("123456789") === 0x31c3);

值得注意的是,此函数也可用于指定 CRC-16 的某些其他变体。例如,将

crc
初始化为
0xFFFF
将正确建模 IBM 3740 软盘上使用的 CRC-16 变体。

XMODEM CRC-16 有时会被误认为是更常见的 CCITT CRC-16(不太容易混淆地称为 KERMIT CRC-16)。它们几乎相同。唯一的区别是 XMODEM 使用 unreflected 多项式,而 KERMIT 使用 reflected 多项式。

纯粹出于比较目的,这里是KERMIT CRC-16版本:

function crc16_refl(str, crc = 0, xorout = 0) {
    for(let i = 0, t; i < str.length; i++, crc &= 0xFFFF) {
        t = crc ^ str.charCodeAt(i);
        t ^= t << 4, t &= 0xFF;
        crc = (crc >> 8) ^ (t << 8) ^ (t >> 4) ^ (t << 3);
    }
    return crc ^ xorout;
}

// Check if test string matches expected result
console.log(crc16_refl("123456789") === 0x2189);

© www.soinside.com 2019 - 2024. All rights reserved.