MODBUS协议解析中常用的转换帮助类(C#)

 由于经常进行数据对接,解析Modbus协议,把常用的几个帮助类做一记录,方便随时查阅,类中包含CRC16校验,进制之间的转换等。

/*********************************************
* 命名空间:ModbusServer.Common
* 功 能: 数据转换帮助类
* 类 名: ConvertTools
* 作 者: 东腾
* 时 间: 2018-09-26 10:20:00
**********************************************
*/ using System;
using System.Globalization;
using System.Linq;
using System.Text; namespace ModbusServer.Common
{
public sealed class ConvertTools
{
/// <summary>
/// 字符串转换为Hex字符串
/// </summary>
/// <param name="s">字符串</param>
/// <param name="encode">编码类型</param>
/// <returns></returns>
public static string StringToHexString(string s, Encoding encode)
{
var b = encode.GetBytes(s); //按照指定编码将string编程字节数组
return b.Aggregate(string.Empty, (current, t) => current + "%" + Convert.ToString(t, ));
} /// <summary>
/// Hex字符串转换为字符串
/// </summary>
/// <param name="hs">Hex字符串</param>
/// <param name="encode">编码类型</param>
/// <returns></returns>
public static string HexStringToString(string hs, Encoding encode)
{
//以%分割字符串,并去掉空字符
var chars = hs.Split(new[] {'%'}, StringSplitOptions.RemoveEmptyEntries);
var b = new byte[chars.Length];
//逐个字符变为16进制字节数据
for (var i = ; i < chars.Length; i++) b[i] = Convert.ToByte(chars[i], ); //按照指定编码将字节数组变为字符串
return encode.GetString(b);
} /// <summary>
/// 字符串转16进制字节数组
/// </summary>
/// <param name="hexString">Hex字符串</param>
/// <returns></returns>
public static byte[] StringToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if (hexString.Length % != )
hexString += " ";
var returnBytes = new byte[hexString.Length / ];
for (var i = ; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * , ), );
return returnBytes;
} /// <summary>
/// 字节数组转16进制字符串
/// </summary>
/// <param name="bytes">bytes</param>
/// <returns></returns>
public static string BytesToHexString(byte[] bytes)
{
const string returnStr = "";
return bytes == null ? returnStr : bytes.Aggregate(returnStr, (current, t) => current + t.ToString("X2"));
} /// <summary>
/// 将byte[]转换成int
/// </summary>
/// <param name="data">需要转换成整数的byte数组</param>
public static int BytesToInt32(byte[] data)
{
//如果传入的字节数组长度小于4,则返回0
if (data.Length < ) return ; //定义要返回的整数
var num = ;
//如果传入的字节数组长度大于4,需要进行处理
if (data.Length < ) return num;
//创建一个临时缓冲区
var tempBuffer = new byte[];
//将传入的字节数组的前4个字节复制到临时缓冲区
Buffer.BlockCopy(data, , tempBuffer, , );
//将临时缓冲区的值转换成整数,并赋给num
num = BitConverter.ToInt32(tempBuffer, );
//返回整数
return num;
} /// <summary>
/// bytes数据转换为float类型
/// </summary>
/// <param name="data">byte数据</param>
/// <returns></returns>
public static float ValueConvertToFloat(byte[] data)
{
var shuju = BytesToHexString(data);
var num = uint.Parse(shuju, NumberStyles.AllowHexSpecifier);
var floatValues = BitConverter.GetBytes(num);
return BitConverter.ToSingle(floatValues, );
} /// <summary>
/// bytes数据转换为long类型
/// </summary>
/// <param name="data">byte数据</param>
/// <returns></returns>
public static long ValueConvertToLong(byte[] data)
{
var shuju = BytesToHexString(data);
var num = ulong.Parse(shuju, NumberStyles.AllowHexSpecifier);
return (long) num;
} public static byte[] CRC16(byte[] data)
{
ushort crc = 0xFFFF; //set all 1 var len = data.Length;
if (len <= )
{
crc = ;
}
else
{
len--;
uint ix;
for (ix = ; ix <= len; ix++)
{
crc = (ushort) (crc ^ data[ix]);
uint iy;
for (iy = ; iy <= ; iy++)
if ((crc & ) != )
crc = (ushort) ((crc >> ) ^ 0xA001);
else
crc = (ushort) (crc >> ); //
}
} var buf1 = (byte) ((crc & 0xff00) >> ); //高位置
var buf2 = (byte) (crc & 0x00ff); //低位置
crc = (ushort) (buf1 << );
crc += buf2;
var strA = crc.ToString("x4");
var result = StringToHexByte(strA);
var b = new byte[];
b[] = result[];
b[] = result[];
return b;
}
}
}

-->

MODBUS协议解析中常用的转换帮助类(C#)的更多相关文章

  1. java中常用的包、类、以及包中常用的类、方法、属性----sql和text\swing

    java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.sql.*; java.text.*; java.a ...

  2. modbus 协议说明及常用格式

    --- 说明: modbus协议一般适用于一个主设备访问多个从设备的硬件开发环境,类似于zigbee网络中的一个路由器多个协调器的一对多模型. modbus常用的寄存器类型为 3X 保持寄存器和 4X ...

  3. JavaWeb学习之JDBC API中常用的接口和类

    JDBC API中包含四个常用的接口和一个类分别是: 1.Connection接口 2.Statement接口 3.PreparedStatement接口 4.ResultSet接口 5.Driver ...

  4. Sql 中常用日期转换Convert(Datetime)

    CONVERT(data_type,expression[,style]) convert(varchar(10),字段名,转换格式) 说明:此样式一般在时间类型(datetime,smalldate ...

  5. Sql 中常用日期转换Convert(Datetime) convert datetime

    Convert(data_type,expression[,style]) Convert(varchar(10),字段名,转换格式) 说明:此样式一般在时间类型(datetime,smalldate ...

  6. Modbus 协议解析

  7. 列举Java中常用的包、类和接口

    常用的类: BufferedReader ,BufferedWriter FileReader    ,FileWirter String      ,Integer Date        ,Cla ...

  8. Servlet中常用对象及API类之间的关系

    Servlet最常用的对象: 请求对象:ServletRequest和HttpServletRequest,通过该对象获取来自客户端的请求信息 响应对象:ServletResponse和HttpSer ...

  9. java中常用的并发工具类

    · 1. 等待多线程完成的CountDownLatch 构造函数接收一个int类型的参数作为计数器,如果想等待N个点,就传入N.当调用CountDownLatch的countDown方法时,N就会减一 ...

随机推荐

  1. ISP PIPLINE (附加1) Green Imbalance

    1.什么是Green imbalance 芯片的Gr和Gb通道获取的能量或者是输出的数据不一致,造成这种情况的原因一方面是Gr,Gb通道的半导体制造工艺方面的差异,另一方面是microlens的存在, ...

  2. 2017-10-29—英语发音的一些技巧总结

    学习了这么多年英语还是一句口语也说不出口,大家一定像我一样有hin多的f*k想说. 在很小的时候我们就学了英语音标,知道了有前元音.中元音.后元音(很多同志多年不用应该已经把这些忘得差不多了,like ...

  3. exit()

    exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统. exit(0) 表示程序正常退出,exit⑴/exit(-1)表示程序异常退出. exit() 结束当前进程/当前程 ...

  4. GMA Round 1 空降

    传送门 空降 在一块100m*100m的平地上,10位战士从天而降!他们每人会均匀随机地落在这个地图上的一个点. 紧随其后,BOSS随机出现在这个地图上的某一点,然后它会奔向位于左上角的出口,而战士们 ...

  5. GMA Round 1 三角形

    传送门 三角形 在△ABC中已知$sin2A+sin2B+sin2C=\frac{3\sqrt{3}}{2}$,求$cos\frac{A}{2}*cos\frac{B}{2}*cos\frac{C}{ ...

  6. 将整数m的各位数字保存到数组A中

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/4 20:10 * @description ...

  7. 校园服务nabcd需求分析

    我们的团队是敲啥都队 口号是敲啥都队敲啥都对 1.你的创意解决了用户的什么需求?(N) 我们校园服务1主要为了节省学生所浪费的没必要的时间.当你还是大一新生的时候,你是否对大学的规划一无所知,你是否迷 ...

  8. PHP 简易聊天室 利用redis的订阅发布功能

    demo:http://www.200ok.fun:8083/api/chat/list 前言:这个种方式太耗redis连接数,每次订阅都会新起一个进程,仅供练手使用,切勿用于生产环境. 原理:1.P ...

  9. cesium 飞线 瓣体传感器(雷达扫描) 效果

    参考:github地址 本人新手,npm webpack 这些还是一知半解,只记录自己得到成功结果的操作步骤,可能存在多余或错误的步骤. 1.github 把代码下载下来,解压. 2.webstorm ...

  10. Django搭建网站笔记

    参考文档 https://www.cnblogs.com/yoyoketang/p/10195102.html https://www.cnblogs.com/yoyoketang/p/1022094 ...