在纠正用 Javascript (node.js) 编写的 CRC-ITU 检查方法中的问题时需要帮助 [英] Need help in correcting issues in CRC-ITU check method written in Javascript (node.js)

查看:12
本文介绍了在纠正用 Javascript (node.js) 编写的 CRC-ITU 检查方法中的问题时需要帮助的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在尝试在 Javascript 上编写 GPS 设备侦听器.

We are trying to code GPS device listener on Javascript.

在执行此操作时,我们无法为 CRC-ITU 错误检查开发正确的脚本.从协议文档生成crc代码的解释如下

While doing this, we are unable to develop the right script for the CRC-ITU error check. The explanation for the crc code generation from protocol document is as below

终端或服务器可以使用校验码来区分接收到的信息是否错误.为了防止错误在数据传输过程中发生,错误检查被添加到对数据误操作,以提高安全性和效率系统.校验码由CRC-ITU校验方法生成.协议结构中数据的校验码,来自信息序列号的数据包长度(包括数据包Length"和Information Serial Number")是 CRC-ITU 的值.CRC计算接收到的信息时发生错误,接收方将忽略并丢弃数据包.

A check code may be used by the terminal or the server to distinguish whether the received information is error or not. To prevent errors occur during data transmission, error check is added to against data misoperation, so as to increase the security and efficiency of the system. The check code is generated by the CRC-ITU checking method. The check codes of data in the structure of the protocol, from the Packet Length to the Information Serial Number (including "Packet Length" and "Information Serial Number") , are values of CRC-ITU. CRC error occur when the received information is calculated, the receiver will ignore and discard the data packet.

我们参考了协议文档中给出的C代码示例-

We referred to the C code sample given in the protocol document -

// calculate the 16-bit CRC of data with predetermined length. 

U16 GetCrc16(const U8* pData, int nLength) 
{ 
   U16 fcs = 0xffff; // initialization 
   while(nLength>0)
   { 
     fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff]; 
     nLength--; 
     pData++; 
   } 
   return ~fcs; // negated 
}

数组 crctab16 与我们的代码示例中提到的数组相同

the array crctab16 is the array same as mentioned in our code sample

    Incoming data string comes in following format

    Example of data packet sent by the terminal 78 78 0D 01 01 23 45 67 89 01 23 45 00 01 8C DD 0D 0A

    Explanation

    Start Bit - 0x78 0x78
    Length - 0x0D
    Protocol - 0x01
    Terminal ID - 0x01 0x23 0x45 0x67 0x89 0x01 0x23 0x45
    Serial No - 0x00 0x01
    Error - 0x8C 0xDD
    Stop Bit - 0x0D 0x0A

我们的 Javascript 代码如下

Our Javascript code below

var net = require('net');

net.createServer(function(socket) 
{

    socket.setEncoding('hex');

    // New client connection event
    socket.on('connect', function(data)

    // Incoming data event
    socket.on('data', function(data) 
    {
        console.log("Client said: " + data); // server log
        data_p = data.substring(4,28);
        err_code = crc16(data_p);
        console.log("error: " + err_code);
    });


    // Disconnect event
    socket.on('end', function()
    {
        //Log it to the server output
        console.log("someone left us." + socket.remoteAddress);
    });

}).listen(3006);

console.log("TCP ECHO SERVER STARTED ON 3006");





function crc16(buf)
{

    var crcTable = 
    [
        0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF, 0X8C48, 0X9DC1, 0XAF5A, 
        0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7, 0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 
        0X75B7, 0X643E, 0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876, 0X2102, 
        0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD, 0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 
        0XEB6E, 0XFAE7, 0XC87C, 0XD9F5, 0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 
        0X453C, 0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974, 0X4204, 0X538D, 
        0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB, 0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 
        0X99E1, 0XAB7A, 0XBAF3, 0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A, 
        0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72, 0X6306, 0X728F, 0X4014, 
        0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9, 0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 
        0X8A78, 0X9BF1, 0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738, 0XFFCF, 
        0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70, 0X8408, 0X9581, 0XA71A, 0XB693, 
        0XC22C, 0XD3A5, 0XE13E, 0XF0B7, 0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 
        0X7CFF, 0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036, 0X18C1, 0X0948, 
        0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E, 0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 
        0XF2A7, 0XC03C, 0XD1B5, 0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD, 
        0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134, 0X39C3, 0X284A, 0X1AD1, 
        0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C, 0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 
        0XA33A, 0XB2B3, 0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB, 0XD68D, 
        0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232, 0X5AC5, 0X4B4C, 0X79D7, 0X685E, 
        0X1CE1, 0X0D68, 0X3FF3, 0X2E7A, 0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 
        0X93B1, 0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9, 0XF78F, 0XE606, 
        0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330, 0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 
        0X2C6A, 0X1EF1, 0X0F78
    ];


    crcX = parseInt("FFFF",16);
    cr1 = parseInt("FF",16);
    cr2 = parseInt("FFFF",16);
    i = 0;

    while(i < buf.length)
    {
        str = buf.substring(i,i+4);
        console.log("str "+str);
        str_hex = parseInt(str,16);

        j = (crcX ^ str_hex) & cr1;
        crcX = (crcX >> 8) ^ crcTable[j] ;

        i = i + 4;
    }

    crcX = ~crcX;

    console.log("crcX - " + crcX.toString(16));
    return crcX;
}

请在下面找到输入字符串对以及应该由函数 crc16 生成的相应代码

Please find below pairs of inputs strings and the corresponding code that should be generated by the function crc16

    78780d01035889905017664600267bf90d0a - 7bf9
    78780d010358899050176646002ab1950d0a - b195
    78780d010358899050176646002ba01c0d0a - a01c

请帮助我们找出代码中的错误.

Please help us find the errors in our code.

非常感谢.

推荐答案

原代码中的 ~ 之所以有效,是因为它是 16 位类型.您应该使用 crcX = crcX ^ 0xffff 而不是 crcX = ~crcX.

The ~ in the original code only worked because it was a 16-bit type. You should use crcX = crcX ^ 0xffff instead of crcX = ~crcX.

您的 buf.substring(i,i+4)i = i + 4 也是错误的.您需要一次处理一个字节,即两个十六进制数字.这些都应该是 i+2.

Also your buf.substring(i,i+4) and i = i + 4 is wrong. You need to process one byte at a time, which is two hexadecimal digits. Those should both be i+2.

这篇关于在纠正用 Javascript (node.js) 编写的 CRC-ITU 检查方法中的问题时需要帮助的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆