【问题标题】:SIP2 Checksum Calculation in JavascriptJavascript 中的 SIP2 校验和计算
【发布时间】:2015-05-27 20:53:32
【问题描述】:

我正在开发使用 SIP2 协议 (https://en.wikipedia.org/wiki/Standard_Interchange_Protocol) 的图书馆系统的 REST 接口,并且能够在不需要纠错的系统上正常工作。但是,我的代码现在正在与另一个需要校验和的系统通信,规范中如此描述:

“要计算校验和,请将每个字符添加为无符号二进制数,取总数的低 16 位并执行 2 的补码。校验和字段是由四个十六进制数字表示的结果。”

我对此进行了几次运行,但无论我做什么,我都无法获得与我的示例消息匹配的校验和。我可能比它应该做的更难(似乎在具有适当二进制类型的低级语言中更容易,等等)。这是我最近的尝试:

var checksum = 0;
var message = "63AOAA21221021780249|AD9999|AY0AZ";

// add each character as an unsigned binary number
for(var i=0;i<message.length;i++){
    checksum += message[i].charCodeAt();
}

console.log("character sum: " + checksum);

// take the lower 16 bits of the total
checksum = checksum.toString(2);
console.log("character sum binary representation: " + checksum);
while(checksum.length < 16){
    checksum = "0" + checksum;
}
checksum = checksum.substr(0,16);
console.log("lower 16 bits of character total: " + checksum);

// convert to dec
checksum = parseInt(checksum,2);
console.log("checksum dec: " + checksum);

// perform 2's complement
checksum = (checksum  & 0xFFFF) * -1;
console.log("2s complement: " + checksum.toString(2));

// convert to 4 hex digits
checksum = dec2hex(checksum);
console.log("checksum hex: " + checksum);

function dec2hex(i) {
   return (i+0x10000).toString(16).substr(-4).toUpperCase();
}

上述字符串的预期校验和是“F39A”。

【问题讨论】:

    标签: javascript checksum


    【解决方案1】:

    我找到了一种方法,它可能不是最优雅的方法,当然也不是高性能,但它工作可靠。

    如果其他不幸的人发现自己想要回答这个问题,下面是代码。我计划将它与库中的其他一些与 SIP2 相关的位捆绑在一起,但现在这里有一个将生成校验和的函数。

     function sip2_checksum(message){
    
        var checksum_int = 0;
        var checksum_binary_string = "";
        var checksum_binary_string_inverted = "";
        var checksum_binary_string_inverted_plus1 = "";
        var checksum_hex_string = "";
    
        // add each character as an unsigned binary number
        for(var i=0;i<message.length;i++){
                checksum_int += message[i].charCodeAt();
        }
    
        // convert integer to binary representation stored in a string
        while(checksum_int > 0){
                checksum_binary_string = (checksum_int % 2).toString() + checksum_binary_string;
                checksum_int = Math.floor(checksum_int / 2);
        }
    
        // pad binary string to 16 bytes
        while(checksum_binary_string.length < 16){
                checksum_binary_string = "0" + checksum_binary_string;
        }
    
        // invert the binary string
        for(var i=0;i<checksum_binary_string.length;i++){
                var inverted_value = "X"; // something weird to make mistakes jump out
                if(checksum_binary_string[i] == "1"){
                        inverted_value = "0";
                } else {
                        inverted_value = "1";
                }
                checksum_binary_string_inverted += inverted_value;
        }
    
        // add 1 to the binary string
        var carry_bit = true;
        for(var i=checksum_binary_string_inverted.length - 1;i>=0;i--){
                if(carry_bit){
                        if(checksum_binary_string_inverted[i] === "0"){
                                checksum_binary_string_inverted_plus1 = "1" + checksum_binary_string_inverted_plus1;
                                carry_bit = false;
                        } else {
                                checksum_binary_string_inverted_plus1 = "0" + checksum_binary_string_inverted_plus1;
                                carry_bit = true;
                        }
                } else {
                        checksum_binary_string_inverted_plus1 = checksum_binary_string_inverted[i] + checksum_binary_string_inverted_plus1;
                }
        }
    
        // convert binary string to hex string and uppercase it because that's what the gateway likes
        checksum_hex_string = parseInt(checksum_binary_string_inverted_plus1,2).toString(16).toUpperCase();
    
        return checksum_hex_string;
     }
    

    【讨论】:

      猜你喜欢
      • 2021-04-05
      • 1970-01-01
      • 2010-12-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      相关资源
      最近更新 更多