Java 实现国网698协议,帧头、数据帧校验算法

最近在做电表测试相关软件,开发过程需要学习698协议,网上关于698协议的资料很少。此文记录一下协议中关于帧头和整帧校验码算法,Java代码如下:

public class Test {public static void main(String[] args) {//定义一个字节数据用于测试byte[] source= {0x2C ,0x00 ,0x43 ,0x05 ,0x50 ,0x10 ,0x10 ,0x42 ,0x00 ,0x00 ,(byte) 0xA1};//调用方法 输出结果System.out.println(bytesToHexFun2(CalcFCS16(source)));}//查询表private static int[] iCRC_16_TABLE_8408 = new int[]{  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};///*** 计算校验码并返回* @param idata_list 字节数组* @return byte[] 帧头校验HCS或帧校验FCS结果 2字节*/public static byte[] CalcFCS16(byte[] idata_list){int fcs = 0xFFFF;for (int i = 0; i < idata_list.length; i++){if(idata_list[i]>0)fcs = (fcs >> 8) ^ iCRC_16_TABLE_8408[(fcs ^ idata_list[i]) % 256];else fcs = (fcs >> 8) ^ iCRC_16_TABLE_8408[(fcs ^ (idata_list[i] >> 32 & 0xff)) % 256];}fcs ^= 0xFFFF;byte[] bLocalArr = new byte[2];bLocalArr[0] = (byte) (fcs  & 0xFF);bLocalArr[1] = (byte) (fcs >> 8  & 0xFF);return bLocalArr;}private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };/*** 字节数组转成16进制字符串 例如[0x01,0x02,0x10,0x11,0xff] ---> 01021011FF* * @param bytes* @return*/public static String bytesToHexFun2(byte[] bytes) {char[] buf = new char[bytes.length * 2];int index = 0;for (byte b : bytes) {buf[index++] = HEX_CHAR[b >>> 4 & 0xf];buf[index++] = HEX_CHAR[b & 0xf];}return new String(buf);}
}

帧头或数据帧按照字节数组传入,方法返回计算完毕的校验码

运行结果如下:

使用校验网址:CRC(循环冗余校验)在线计算_ip33.com测试,验证结果一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境电商选品API商品采集API接入指南

选品是每个电商卖家的必经之路&#xff0c;产品的好坏将直接决定店铺的盈利、发展方向。选择合适的产品可以让卖家事半功倍&#xff0c;快速爆单。 用API实现代购系统和1688淘宝等平台的商品信息对接&#xff0c;可以免去很多选品工作。 item_get 获得淘宝商品详情item_get_p…

在vue3中使用el-tree-select做一个树形下拉选择器

el-tree-select是一个含有下拉菜单的树形选择器&#xff0c;结合了 el-tree 和 el-select 两个组件的功能。 因为包含了el-tree的功能&#xff0c;我们可以自定义tree的节点&#xff0c;创造出想要的组件 使用default插槽可以自定义节点内容&#xff0c;它的default插槽相当于…

Day19:信息打点-红蓝队自动化项目资产侦察武器库部署企查产权网络空间

目录 各类红蓝队优秀工具项目集合 自动化-武器库部署-F8x 自动化-网络空间-AsamF 自动化-企查信息-ENScan 自动化-综合架构-ARL&Nemo 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应…

高中数学:单调奇偶综合(较难)

一、奇偶性扩展 1、普通轴对称函数 要会根据抽象函数的关系&#xff0c;找出对称轴 简便记法&#xff1a;纵相等&#xff0c;对称轴 2、普通中心对称函数 要会找出对称中心点坐标 简便记法&#xff1a;纵和定&#xff0c;中心点 二、题型汇总 解题方法 抽象函数 1、…

如果不使用管理器,星露谷如何安装模组

Mac、Linux、安卓系统建议阅读官方WIKI 如果你没有特殊的需求&#xff0c;可以使用小火星露谷管理器一键安装模组 https://smallfire.cn 1. 什么是模组&#xff1f; 扩展或修改游戏的文件。可以改变游戏。功能如下&#xff1a; 扩展游戏内容&#xff0c;比如添加额外的游戏…

C++ 多态的概述

文章目录 1、概念2、引入3、使用基类指针、引用 访问 子类对象中的成员方法&#xff08;虚函数&#xff09;4、基类指针作为函数的参数 函数可以操作该基类派生出的任意子类对象 1、概念 多态是c的特征之一 多态的分类&#xff1a;静态多态&#xff08;静态联编&#xff09;、…

Android Studio开发(二) 常用布局

1、概述 在Android Studio中&#xff0c;布局方式指的是用于定义和排列界面元素&#xff08;如按钮、文本框、图片等&#xff09;的方式。Android应用的界面通常由多个视图组件组成&#xff0c;而布局方式则确定了这些视图组件在屏幕上的位置、大小和相互关系。 适应不同屏幕尺…

时钟显示 html JavaScript

sf.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>时间</title><script>function showTime(){var timenew Date();var datetime.getDate();var yeartime.getFullYear();var monthtime.getMonth()1;var …

Tailscale中继服务derper使用docker-compose部署

docker启动 docker run --restart always \--name derper -p 12345:12345 -p 3478:3478/udp \-v /root/.acme.sh/xxxx/:/app/certs \-e DERP_CERT_MODEmanual \-e DERP_ADDR12345 \-e DERP_DOMAINxxxx \-d ghcr.io/yangchuansheng/derper:latestdocker-compose启动 version: …

vue3中的生命周期有哪些和怎么使用?

目录 前言&#xff1a; 正文&#xff1a; 总结: 前言&#xff1a; Vue.js 3是Vue.js框架的最新主要版本&#xff0c;引入了一些重大的改变和增强。在Vue 3中&#xff0c;由于Composition API的引入&#xff0c;生命周期钩子被替换为生命周期函数。 正文&#xff1a; 以下是…

Golang的Channel源码阅读、工作流程分析。

Channel整体结构 源码位置 位于src/runtime下的chan.go中。 Channel整体结构图 图源&#xff1a;https://i6448038.github.io/2019/04/11/go-channel/ Channel结构体 type hchan struct {qcount uint // total data in the queuedataqsiz uint // si…

lightGBM的学习整理

执行步骤 1、初始化&#xff0c;选择一个初始模型&#xff0c;通常是一个常数&#xff0c;比如分类问题中内的类别概率的先验值&#xff0c;回归问题中的目标变量的平均值。 2、训练决策树&#xff0c;对于每一轮迭代&#xff0c;计算当前模型的梯度&#xff08;损失函数的负…

外汇天眼:投其所好精设“杀猪盘”!假冒平台诈骗360万!

近年来&#xff0c;愈来愈多民众有感于物价急速上涨&#xff0c;为了避免因为通胀而导致资产持续缩水&#xff0c;纷纷开始寻找可以获利的投资机会&#xff0c;没想到却因此落入诈骗集团的陷阱&#xff0c;蒙受极大的财务损失。 最近外汇天眼就收到一位受害者针对IMX的爆料&…

亚信安慧AntDB:数据库自主创新的缩影

AntDB作为一款自主研发的数据库系统&#xff0c;具备了国产化升级改造的核心能力。这款数据库系统通过不懈努力和持续探索&#xff0c;实现了从跟随他人到引领潮流的华丽转身。AntDB不仅仅是一种技术产品&#xff0c;更是体现了自主研发能力的缩影&#xff0c;体现了科技企业在…

操作系统---第一课

操作系统&#xff1a; 控制和管理整个计算机系统的硬件和软件资源。向上层提供方便易使用的服务&#xff0c;是最接近硬件的一层软件。 功能&#xff1a;文件管理&#xff0c;存储器管理&#xff0c;设备管理&#xff0c;处理机管理。 操作系统的四个特征&#xff1a; 并发 &…

2024最新Android大厂面试真题大全,推荐学习

历时半年&#xff0c;我们终于整理出了这份市面上最全面的最新Android面试题解析大全&#xff01; 章节目录 第一章&#xff1a;Android 基础 面试题 第二章&#xff1a;Android 高级 面试题 第三章&#xff1a;开源框架实战面试解析 第四章&#xff1a;Java 面试题 第五章&a…

Sqli-labs靶场第15关详解[Sqli-labs-less-15]自动化注入-SQLmap工具注入

Sqli-labs-Less-15 #自动化注入-SQLmap工具注入 SQLmap用户手册&#xff1a;文档介绍 - sqlmap 用户手册 由于这题是post请求&#xff0c;所以先使用burp进行抓包&#xff0c;然后将数据包存入txt文件中打包 用-r 选择目标txt文件 python sqlmap.py -r data.txt -current-db…

算法练习:双指针

目录 1. 双指针1.1 移动 "0"1.2 复写 "0"1.3 快乐数&#xff08;快慢指针&#xff09;1.4 盛水最多的容器&#xff08;单调性原则&#xff09;1.5 有效三角形个数1.6 两个数之和1.7 三数之和1.8 四数之和 1. 双指针 1.1 移动 “0” 题目信息&#xff1a; …

1.4 简述“分组卷积”及其应用场景

1.4 简述“分组卷积”及其应用场景 普通卷积&#xff1a;在普通的卷积操作中&#xff0c;一个卷积核对应输出特征图的一个通道&#xff0c;而每个卷积核又会作用在输入特征图的所有通道上(即卷积核的通道数等于输入特征图的通道数)&#xff0c;因此最终输出特征图的每个通道都…

算法简单试题

一、选择题 01.一个算法应该是( B ). A.程序 B.问题求解步骤的描述 C.要满足五个基本特性 D.A和C 02&#xff0e;某算法的时间复杂度为O(n)&#xff0c;则表示该…