当前位置: 首页 > news >正文

海康充电桩报文校验TCP校验和

1 TCP校验文档校验文档要求:

       校验码描述 校验码计算范围包含包头标识、消息头和消息体,校验算法采用 TCP 和校验,具体规则如下。

  1. 将待校验的所有数据分为 16 位的字(大端序),如果总长度为奇数个字节,则在最后增添一个 位都为 0 的字节;
  2.  将所有 16 位的字进行累加,累加结果大于 16 位时把进位一起加到低 16 位的校验和中;
  3.  对计算的检验和取反,作为最后的校验结果,大端序输出;

  官方文档带有示例数据,如下图:

这是我们开发中经常用到用累加,取反作校验数据完整性,下面用java代码实现

 java代码实现海康充电桩报文校验TCP的校验,代码如下:

/*** @author hua* @date 2022/11/13 21:39*/
public class mainTest {/*** 海康充电桩报文校验TCP校验和.* @param data 待校验的数据字节数组* @return 计算出的16位校验和*/public static short calculateTcpChecksumByHK(byte[] data) {int sum = 0;// 如果数据长度为奇数,添加一个0字节if (data.length % 2 > 0) {byte[] paddedData = new byte[data.length + 1];System.arraycopy(data, 0, paddedData, 0, data.length);data = paddedData;}// 将所有16位的字进行累加for (int i = 0; i < data.length; i += 2) {int word = ((data[i] << 8) & 0xFF00) + (data[i + 1] & 0xFF);sum += word;// 处理可能的进位while (sum > 0xFFFF) {sum = (sum & 0xFFFF) + (sum >> 16);}}// 取反并转换为short类型return (short) ~sum;}public static void main(String[] args) {byte[] data = {(byte)0x7d, (byte)0x7b, (byte)0x01, (byte)0x00,(byte)0x00, (byte)0x80, (byte)0xdd, (byte)0x00,(byte)0x04, (byte)0x04, (byte)0x01, (byte)0x02, (byte)0x00};short checksum = calculateTcpChecksumByHK(data);System.out.println("Checksum: " + String.format("%04X", checksum));}

下面用以上官方文档数据进行测试,输出结果9efd 与官方文档的测试结果一致如下图:

相关文章:

  • 刷题——链表中倒数最后k个结点
  • 什么是隐马尔可夫模型?
  • 【第5章】Stable Diffusion大模型(简介/两种版本/安装/模型推荐/使用方式)ComfyUI基础入门教程
  • 【Vue3】使用v-model实现父子组件通信(常用在组件封装规范中)
  • Part 4.2 背包动态规划
  • 适用于 macOS 的最佳免费数据恢复软件
  • 浏览器必装插件推荐:最新版Simple Allow Copy,解除网页复制限制!
  • Arcgis投影问题
  • 在mysql中GROUP_CONCAT字段的作用
  • vivado PIN
  • Adam优化算法
  • 找工作小项目:day16-重构核心库、使用智能指针(2)
  • 数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践
  • go 定时任务
  • 多目标跟踪中用到的求解线性分配问题(Linear Assignment Problem,LAP)C++
  • ES6指北【2】—— 箭头函数
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【Amaple教程】5. 插件
  • ES2017异步函数现已正式可用
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • go语言学习初探(一)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • 前端学习笔记之观察者模式
  • 一起参Ember.js讨论、问答社区。
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 我们雇佣了一只大猴子...
  • ​520就是要宠粉,你的心头书我买单
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #HarmonyOS:Web组件的使用
  • #单片机(TB6600驱动42步进电机)
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)nginx 安装、启停
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (C++17) optional的使用
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (三分钟)速览传统边缘检测算子
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET 命令行参数包含应用程序路径吗?
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @PostConstruct 注解的方法用于资源的初始化
  • [000-01-022].第06节:RabbitMQ中的交换机介绍
  • [20150707]外部表与rowid.txt
  • [Android]How to use FFmpeg to decode Android f...
  • [autojs]逍遥模拟器和vscode对接
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [C#基础知识系列]专题十七:深入理解动态类型