c# HJ212协议组包

c# HJ212协议组包c#关于HJ212协议组包今天突然想起好久没有登过博客了又将近两年没有更新怪我太懒散了。。。工作中学习到的很多但也很容易忘记用过的东西某天可能想再用的时候却想不起来了或者找不到了只能挠头~~好了进入正题我在工作中关于HJ212协议这块用到的还是很多的今天来写一写在c#中HJ212协议如何组包以及有了报文内容如何转换为完整报文:先放一张转换为完整报文的成果图:以下为实际代码:publicpartialclassForm1:Form

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

c# 关于HJ212协议组包

今天突然想起好久没有登过博客了 又将近两年没有更新
太懒散。。太懒散了。。。
工作中学习到的很多 但也很容易忘记 用过的东西某天可能想再用的时候却想不起来了 或者找不到了 只能挠头哇~~
好了 进入正题 我在工作中关于HJ212协议这块用到的还是很多的 下面是一个简单的demo ——给现有HJ212报文加上报文头及检验码得到完整212报文
在demo中的HJ212辅助类中有212协议组包的相关代码 有需要的可自行参考~
先放一张转换为完整报文的成果图:
在这里插入图片描述

以下为完整代码:

    public partial class Form1 : Form
    { 
   
        public Form1()
        { 
   
            InitializeComponent();
            textBox1.Text="QN=20210119145656000;ST=31;CN=2011;PW=123456;MN=88800000111;Flag=5;CP=&&DataTime= 20200801084000;a21026-Rtd=10.5,a21026-Flag=N;a25002-Rtd=32.23,a25002-Flag=N&&";
        }

        private void btnChange_Click(object sender, EventArgs e)
        { 
   
            textBox2.Clear();
            textBox2.Text=  GetBackCmd(textBox1.Text);
        }
        public static string GetBackCmd(string Mode)
        { 
   
            string strHead = "##";
            string strlen = "";
            string strMode = Mode;
            strlen = strMode.Length.ToString("0000");
            strMode = strHead + strlen + strMode +HJ212Mode.Crc_16(strMode) + "\r\n";
            return strMode;
        }

    }
    public class HJ212Mode
    { 
   
        #region 212协议组包
        /// <summary>
        /// 获取212协议报文
        /// </summary>
        /// <param name="MN=27">设备唯一标识</param>
        /// <param name="CN=2011">命令编号</param>
        /// <param name="CP">数据</param>
        /// <param name="ST=31">系统编号</param>
        /// <param name="PW">访问密码</param>
        /// <param name="Flag">是否分包及应答标识(0:不应答,不分包 3:应答且分包)</param>
        /// <param name="RevAllData">原报文</param>
        /// <returns></returns>
        public static string GetBackCmd(string MN, string CN, string CP, string ST = "31", string PW = "123456", string Flag = "0", string RevAllData = null)
        { 
   
            string strHead = "##";
            string strlen = "";
            string strQN = "QN=" + DateTime.Now.ToString("yyyyMMddHHmmss000");
            string strST = "ST=" + ST;
            string strCN = "CN=" + CN;
            string strPW = "PW=" + PW;
            string strMN = "MN=" + MN;
            string strFlag = "Flag=" + Flag;
            string strCP = "CP=&&" + CP + "&&";
            //string strCRC = "";

            //从原报文中获取ST和PW
            if (RevAllData != null && RevAllData != "")
            { 
   
                string str = "";
                str = GetParamValue(RevAllData, "ST=");
                if (str != null && str != null)
                { 
   
                    strST = "ST=" + str;
                }
                str = GetParamValue(RevAllData, "PW=");
                if (str != null && str != null)
                { 
   
                    strPW = "PW=" + str;
                }
            }
            //组装需要计算长度及校验的部分
            string strMode = "";
            strMode = strQN + ";" +
                    strST + ";" +
                    strCN + ";" +
                    strPW + ";" +
                    strMN + ";" +
                    strFlag + ";" +
                    strCP;
            strlen = strMode.Length.ToString("0000");
            strMode = strHead + strlen + strMode + Crc_16(strMode) + "\r\n";
            return strMode;
        }
        #endregion
        #region 获取数据报文中指定参数的值
        /** * 获取数据报文中指定参数的值 * @param strData 完整字符串 * @param strParam 对应的字符串 * @return */
        public static String GetParamValue(String strData, String strParam)
        { 
   
            //string strDataLow = strData.ToLower();
            //##0147ST=32;CN=2011;PW=123456;MN=88888880000001;
            //CP=&&DataTime=20100623130500;010-Rtd=10.00,010-Flag=N;011-Rtd=10.00,011-Flag=N;015-Rtd=10.00,015-Flag=N&&D081

            String strDataLow = strData;
            int iPosBegin = strDataLow.IndexOf(strParam, 0);
            if (iPosBegin < 0) return null;
            int iPosC = strDataLow.IndexOf(",", iPosBegin);
            int iPosS = strDataLow.IndexOf(";", iPosBegin);
            int iPosA = strDataLow.IndexOf("&", iPosBegin);
            int iPosEnd = GetValuePos(iPosC, iPosS);
            iPosEnd = GetValuePos(iPosA, iPosEnd);
            int iPosE = strDataLow.IndexOf("=", iPosBegin);
            String strValue = null;
            try
            { 
   
                //if (iPosS < 0) //数据区只有一个数据
                //{ 
   
                // strValue = strDataLow.Substring(iPosE + 1, iPosA - iPosE - 1);
                // //System.out.println("SS"+strValue);
                // return strValue;
                //}
                if (iPosA < 0)
                { 
   
                    iPosA = strDataLow.Length;
                }
                if (iPosEnd == iPosA)
                { 
   
                    iPosEnd = strDataLow.IndexOf("&", iPosA + 2);
                    strValue = strDataLow.Substring(iPosA, iPosEnd - iPosA);
                    return strValue.Replace("&&", "");
                }

                if (iPosEnd > iPosE + 1)
                { 
   
                    strValue = strDataLow.Substring(iPosE + 1, iPosEnd - iPosE - 1);
                    return strValue.Replace(" ", "");
                }
                else return null;
            }
            catch (Exception ex)
            { 
   
                Console.WriteLine("HJ212_Mode", ex.ToString());
                return null;
            }
        }
        #endregion
        #region 判断分隔符的正确位置
        /** * 判断分隔符的正确位置 * @param iPos1 * @param iPos2 * @return */
        public static int GetValuePos(int iPos1, int iPos2)
        { 
   
            if (iPos1 >= 0 && iPos2 >= 0)
                return iPos1 > iPos2 ? iPos2 : iPos1;
            else if (iPos1 < 0 && iPos2 < 0)
                return -1;
            else if (iPos1 >= 0 && iPos2 < 0)
                return iPos1;
            else if (iPos1 < 0 && iPos2 >= 0)
                return iPos2;
            else return -1;
        }
        #endregion
        #region 212协议校验
        /// <summary>
        /// 212协议校验
        /// </summary>
        /// <param name="strData"></param>
        /// <returns></returns>
        public static string Crc_16(string strData)
        { 
   
            byte crc16Lo, crc16Hi;
            byte saveLo, saveHi;
            System.Text.Encoding chs = System.Text.Encoding.GetEncoding("gb2312");
            byte[] bits = chs.GetBytes(strData);

            crc16Hi = 0xFF;
            crc16Lo = 0x00;
            for (int i = 0; i < bits.Length; i++)
            { 
   
                crc16Lo = crc16Hi;
                crc16Hi = 0;
                crc16Lo ^= bits[i];

                for (int g = 0; g < 8; g++)
                { 
   
                    saveHi = crc16Hi;
                    saveLo = crc16Lo;
                    crc16Hi /= 2;
                    crc16Lo /= 2;
                    if (saveHi % 2 == 1)
                    { 
   
                        crc16Lo |= 0x80;
                    }
                    if (saveLo % 2 == 1)
                    { 
   
                        crc16Hi ^= 0xA0;
                        crc16Lo ^= 0x01;
                    }
                }
            }
            return crc16Hi.ToString("X2") + crc16Lo.ToString("X2");
        }
        #endregion
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159961.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • charles抓包整理

    charles抓包整理这里汇总了工作中charles的使用。Fidder使用C#开发的,所以就不能在Mac上使用了,不过还有另外一个抓包神器,就是Charles,它是Java开发的,所以跨平台,不仅可以在Mac上使用,Linux以及Window下都是可以使用的,当然需要安装JDK,才能运行,同时还有一个问题就是他是收费的。Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器…

  • 【全流程】从头在树莓派4B上部署自己训练的yolov5模型(配合NCS2加速)

    【全流程】从头在树莓派4B上部署自己训练的yolov5模型(配合NCS2加速)目录0.前言1.我的环境2.整个流程3.具体过程3.1训练自己的yolov5模型3.2将.pt模型转换为.onnx模型3.3在本地将.onnx转换成IR模型3.4在树莓派4B上使用IR模型推理4.一些坑4.1树莓派4B上安装pytorch4.2安装好了pytorch没法用4.3模型转换失败4.4转换好的模型推测出的结果和原模型相差较大5.总结0.前言最近这一个月基本没写过博客,因为一直在树莓派4B上部署yolov5的模型,已经数不清楚踩了多少坑了,来来回回折腾了一个月,终于完成了。于

  • 7-1 正整数A+B > 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。「建议收藏」

    7-1 正整数A+B > 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。「建议收藏」7-1 正整数A+B题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。输入格式:输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个…

  • 图片的文件格式后缀名_各种文件的后缀名

    图片的文件格式后缀名_各种文件的后缀名常见的文件后缀名.ACA:Microsoft的代理使用的角色文档.acf:系统管理配置.acm:音频压缩管理驱动程序,为Windows系统提供各种声音格式的编码和解码功能.aif:声音文件,支持压缩,可以使用WindowsMediaPlayer和QuickTimePlayer播放.AIF:音频文件,使用WindowsMediaPlayer播放.AIFC:音频文件,使用Win…

    2022年10月25日
  • BurpSuite系列(五)—-Intruder模块(暴力激活成功教程)「建议收藏」

    BurpSuite系列(五)—-Intruder模块(暴力激活成功教程)「建议收藏」一、简介BurpIntruder是一个强大的工具,用于自动对Web应用程序自定义的攻击,BurpIntruder是高度可配置的,并被用来在广范围内进行自动化攻击。你可以使用BurpIntruder方便地执行许多任务,包括枚举标识符,获取有用数据,漏洞模糊测试。合适的攻击类型取决于应用程序的情况,可能包括:缺陷测试:SQL注入,跨站点脚本,缓冲区溢出,路径遍历;暴力攻击认证

  • 移动端fastClick使用

    移动端fastClick使用作为一个新手,插件原理什么的研究不透,看的也是似懂非懂的,网上有很多大牛写的博文相当的好   在这里我只是简单的记录下简单的用法,还请大牛们不吝赐教     为什么存在延迟?     从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约300毫秒的等待时间。为什么这么设计呢?因为它想看看你是不是要进行双击(doubletap)操作。1、引入插件的jav…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号