javascript 如何计算CheckSum8 2s补码

new9mtju  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(221)

我试图在javascript中计算字节数组的校验和,但无法做到这一点。这里是提供结果的参考网站
https://www.scadacore.com/tools/programming-calculators/online-checksum-calculator/
字母值= ffee031000149267cf4596675897a710d9c1368c1d8dbe27d05513d16374f6f572666f6aa0
结果= 57
如何在javascript中实现这一点?
尝试代码

const CalculateChecksum = (value) =>{
      let test = value.match(/.{1,2}/g);
      const intValue = BigInt(`0x${value.toString('hex')}`);
       return Number(intValue % BigInt(37));
    }
7uhlpewt

7uhlpewt1#

总的策略是这样的:
1.将字符串拆分为字节
1.合计所有字节
1.仅查看最低8位
1.因为结果应该是“你需要加到和上得到0的量”,所以你必须从256中减去这个和。
下面是一些示例代码:

const stringToByteArray = (value) => {
    if (value.length % 2 !== 0) {
        return stringToByteArray(`0${value}`);
    }
    return [...value]
        .reduce((result, _, index) => {
            if (index % 2 === 0) {
                return [...result, value.substring(index, index + 2)];
            }
            return result;
        }, [])
        .map((value) => {
            return parseInt(value, 16);
        });
};

const checksum = (bytes) => {
    return (
        256 -
        (bytes.reduce((total, next) => {
            return total + next;
        }, 0) %
            256)
    );
};

const CalculateChecksum = (value) => {
    return checksum(stringToByteArray(value));
};

const v =
    'ffee031000149267cf4596675897a710d9c1368c1d8dbe27d05513ded16374f6f572666f6aa0';
const c = CalculateChecksum(v);
console.log(`0x${c.toString(16)}`);

Reference

相关问题