这个函数计算什么样的校验和?

时间:2015-07-02 10:33:50

标签: javascript

这是bytes来自string的函数,并抓取每个字母的字符代码以创建bytyes的数组

function checksum(bytes) {
    var a = 0;
    var b = 0;

    for (var i = 0; i < bytes.length; i++) {
        a = (a + bytes[i]) % 0xff;
        b = (b + a) % 0xff;
    }

    return (b << 8) | a;
}

我对% 0xffb << 8的角色感到困惑。有人可以帮我打破这个吗?

2 个答案:

答案 0 :(得分:1)

a等于模数为255的所有元素的总和 b等于假定模255的所有值的总和(所以1次是最后一个元素+ 2倍之前的那个......)

最终值为16位数,其中高8位为b,低8位为a。

这实际上是弗莱彻的校验和

https://en.wikipedia.org/wiki/Fletcher%27s_checksum

答案 1 :(得分:0)

此函数计算a和b,并从中生成校验和。

a 的计算方法如下:

  • 0 +当前char的值
  • a必须介于0到254之间,因此模数为255

b 计算为模255的累积值

  • 通过
  • 增加b的值
  • b必须介于0到254之间,因此模数为255

最后,通过连接a到b

生成校验和
  • 取b的位并向左移动8个位置
  • 将a设置为b
  • 的右侧

结果的长度为2个字节(16位),其中第一个字节为b,第二个字节为a。

示例:

(c is the current char value)
c    | a   |b
----------------
8    |8    |8
13   |21   |29
5    |26   |55
0    |26   |81
180  |206  |287
100  |51   |83
cheksum = 51,83 = 0x3353 = 0011 0011 0101 0011