需要帮助纠正用 Javascript (node.js) 编写的 CRC-ITU 检查方法中的问题

2023-11-29

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

在此过程中,我们无法开发正确的 CRC-ITU 错误检查脚本。协议文档生成crc码的解释如下

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

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

// 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 与我们的代码示例中提到的数组相同

    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 代码如下

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 生成的相应代码

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

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

非常感谢。


The ~原始代码中的代码之所以有效,是因为它是 16 位类型。你应该使用crcX = crcX ^ 0xffff代替crcX = ~crcX.

还有你的buf.substring(i,i+4) and i = i + 4是错的。您需要一次处理一个字节,即两个十六进制数字。那些应该都是i+2.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要帮助纠正用 Javascript (node.js) 编写的 CRC-ITU 检查方法中的问题 的相关文章

随机推荐

  • Android:闹钟每 30 分钟播放一次,从 12:30 开始

    这里我将使用闹钟服务每 30 分钟播放一次闹钟 现在我已将其设置为从 Every start 开始每 10 秒播放一次 这是代码 Override public void onCreate Bundle savedInstanceState
  • 将非常大的 JSON 文件转换为 CSV

    我有一个大小约为 8GB 的 JSON 文件 当我尝试使用此脚本转换文件时 import csv import json infile open filename json r outfile open data csv w writer
  • 如何在 php 中创建安全的 mysql 准备语句?

    我是在 mysql 和 php 中使用准备好的语句的新手 我需要一些帮助来创建准备好的语句来检索列 我需要从不同的列获取信息 目前对于测试文件 我使用完全不安全SQL语句 qry SELECT FROM mytable where user
  • 有什么方法可以使用给定的索引节点号搜索文件或文件名吗?

    我正在从用户那里获取索引节点号 并且必须在文件系统中搜索该文件 如何搜索 inode 编号 我必须使用 C 和 unix 来完成此操作 到目前为止 这是我的代码 include
  • 链接命名范围未按预期工作

    我有两个简单的命名范围定义如下 class Numbers lt ActiveRecord Base named scope even conditions gt title gt 2 4 6 named scope odd conditi
  • 通过 grep 两次管道尾部输出

    使用典型的 Apache 访问日志 您可以运行 tail f access log grep 127 0 0 1 它只会显示指定 IP 地址的日志 创建时 但是为什么当你通过管道传输时会失败grep第二次 进一步限制结果 例如 css 的简
  • 移动平均查询 MS Access

    我正在尝试计算数据的移动平均值 我用谷歌搜索并在这个网站和其他网站上找到了很多例子 但我仍然感到困惑 我需要计算为特定产品选择的记录的前 5 个流量的平均值 我的表如下所示 TMDT Prod Flow 8 21 2017 12 01 00
  • 使用图像模块(python)将希伯来语文本绘制为图像

    这是我已经问过的一个问题 并且有几个得到了答案 但问题仍然存在 当我尝试使用图像模块用希伯来语写入图像时 我得到的不是希伯来语字母而是其他 ascii 字母 如果我转换为 unicode 或 ascii 我会收到一个它不支持的错误 我在这里
  • Windows TCP 套接字默认启用 SO_KEEPALIVE 吗?

    我在 TCP 套接字方面遇到了一个奇怪的错误 看起来SO KEEPALIVE默认情况下在所有套接字上启用 我编写了一个简短的测试用例来创建套接字并连接到服务器 连接后 我立即检查SO KEEPALIVE with getsockopt 该值
  • 转换元组类型

    所以我是提升 MPL 的新手 我不知道如何将它与标准类型一起使用 我想要一个隐藏这种类型的元函数 std tuple
  • FLOT 趋势线

    包括我jquery flot trendline js 从这里 这是我的代码 plot placeholder seriesdata series trendline show true lineWidth 2 fill true fill
  • 为什么 numpy.random.choice 不使用算术编码?

    如果我评估类似 numpy random choice 2 size 100000 p 0 01 0 99 使用一个均匀分布的随机数float say r 并决定是否r lt 0 01可能会浪费许多生成的随机位 熵 我听说 二手 生成伪随机
  • Fuseki SPARQL INSERT 生成“错误 400:SPARQL 查询:无 'query=' 参数”

    我尝试将一个人插入到我的本体中 但出现错误 Error 400 SPARQL Query No query parameter Fuseki version 2 4 1 Build date 2016 11 04T18 59 20 0000
  • 如何获取要粘贴到 html 文本编辑器中的文本?

    我的主页 文本区域 中有一个小型文本编辑器 我可以在其中粘贴文本 在粘贴之前如何将该文本放入变量中 我知道有这个功能 clipboardData getData 但它在 Firefox 中不起作用 我想要适用于所有浏览器的东西 我正在使用
  • 如何将 Sass 函数转换为 Less 函数?

    有谁知道如何在 Less 中重新创建以下 Sass 函数 我希望能够轻松转换任何 CSS 属性内的单位 例如 字体大小 边距 填充等 Sass function get vw target vw context 1440 0 01 1px
  • MYSQL中DBCC INPUTBUFFER(@@SPID)(为当前连接或指定连接提供sql语句)的等效语句是什么?

    是什么MySQL 等效项声明DBCC INPUTBUFFER SPID 其中列出了当前连接或指定连接的sql语句 Use 显示资料查看发送到 MySQL 的最新语句的列表 SHOW PROFILES 如果您想要 需要查看当前正在运行的查询
  • Java泛型方法声明基础

    我开始学习Genericsfor Java我读了几个教程 但我有点困惑 不确定如何声明泛型方法 当我使用泛型类型时 定义方法的正确顺序是什么 我找到了这个示例 什么时候需要使用尖括号 什么时候不需要 public class Box a p
  • 从 datetime.timedelta 对象中删除“ x days ”

    我需要创建一个报告 其中需要减去两个日期并以以下形式返回 H M S 这是我插入列表中的减法 time difference temp datetime strptime next time Y m d H M S datetime str
  • Java:以一定角度移动对象并使用 KeyPress 改变角度

    好的 所以我想要的是矩形始终移动 但是当您按下左右箭头时 会通过增加或减少角度来改变方向 使用此代码 正方形会按照正确的方向移动 但是当我按下按键时 方向不会改变 import java awt import java awt Color
  • 需要帮助纠正用 Javascript (node.js) 编写的 CRC-ITU 检查方法中的问题

    我们正在尝试在 Javascript 上编写 GPS 设备侦听器代码 在此过程中 我们无法开发正确的 CRC ITU 错误检查脚本 协议文档生成crc码的解释如下 终端或服务器可以使用校验码来区分 接收到的信息是否有误 为了防止错误 数据传