使用Javascript

时间:2018-01-18 19:04:52

标签: javascript hash hex ascii checksum

我正在尝试模仿一个Windows应用程序格式化消息并通过USB将其通过USB发送到显示该消息的设备。

应用程序计算校验和并在消息后粘贴,否则设备将不接受该命令。校验和不是crc8校验和,但它是什么呢?

使用USB监视器,我看到了以下测试用例:

ASCII:<L1><PA><IB><MA><WC><OM>Test!
HEX:3c4c313e3c50413e3c49423e3c4d413e3c57433e3c4f4d3e5465737421
校验和:6A

ASCII:<L1><PA><IB><MA><WC><OM>Testa!
HEX:3c4c313e3c50413e3c49423e3c4d413e3c57433e3c4f4d3e546573746121
校验和:0B

ASCII:<L1><PA><IB><MA><WC><OM>Test some more
HEX:3c4c313e3c50413e3c49423e3c4d413e3c57433e3c4f4d3e5465737420736f6d65206d6f7265
校验和:4A

ASCII:<L1><PA><IE><MA><WC><OE>[SPACE]
HEX:3c4c313e3c50413e3c49453e3c4d413e3c57433e3c4f453e20
校验和:52

This website会在第一行(CheckSum8 Xor)中返回正确的校验和。我试图模仿这个功能。 (注意:当您发送ASCII值时,网站会因为包含<>个字符而变得怪异。请改用HEX值!)

目前,我的代码执行此操作:

let hex = ascii2hex('<L1><PA><IB><MA><WC><OM>Test!') // or one of the other ascii values
let checksum = chk8xor(hex)
console.log(checksum)

function ascii2hex(str) {
  var arr = [];
  for (var i = 0, l = str.length; i < l; i ++) {
    var hex = Number(str.charCodeAt(i)).toString(16);
    arr.push(hex);
  }
  return arr;
}

function chk8xor(byteArray) {
  let checksum = 0x00
  for(let i = 0; i < byteArray.length - 1; i++)
    checksum ^= byteArray[i]
  return checksum
}

(JavaScript的)

代码有效,但返回的校验和不正确。例如,第一个测试用例返回50而不是6A

我确定我错过了一些简单的事情 我的做法与上面提到的网站有什么不同?

1 个答案:

答案 0 :(得分:3)

你不需要任何&#34; hex&#34;这里的字符串,只需取ASCII值并将其与校验和进行异或运算:

&#13;
&#13;
test = [
    '<L1><PA><IB><MA><WC><OM>Test!',
    '<L1><PA><IB><MA><WC><OM>Testa!',
    '<L1><PA><IB><MA><WC><OM>Test some more',
    '<L1><PA><IE><MA><WC><OE> ',
]


for (let str of test) {
    let cs = 0;
    for (let char of str)
        cs ^= char.charCodeAt(0)
    console.log(str, cs.toString(16))
}
&#13;
&#13;
&#13;

如果您喜欢&#34;功能性&#34;样式,你可以把内循环写成

let cs = [...str].map(a => a.charCodeAt(0)).reduce((a, b) => a ^ b);