MODBUS協議解析中經常使用的轉換幫助類(C#)

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, 16));
        }

        /// <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 = 0; i < chars.Length; i++) b[i] = Convert.ToByte(chars[i], 16);

            //按照指定編碼將字節數組變爲字符串
            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 % 2 != 0)
                hexString += " ";
            var returnBytes = new byte[hexString.Length / 2];
            for (var i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            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 < 4) return 0;

            //定義要返回的整數
            var num = 0;
            //若是傳入的字節數組長度大於4,須要進行處理
            if (data.Length < 4) return num;
            //建立一個臨時緩衝區
            var tempBuffer = new byte[4];
            //將傳入的字節數組的前4個字節複製到臨時緩衝區
            Buffer.BlockCopy(data, 0, tempBuffer, 0, 4);
            //將臨時緩衝區的值轉換成整數,並賦給num
            num = BitConverter.ToInt32(tempBuffer, 0);
            //返回整數
            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, 0);
        }

        /// <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 <= 0)
            {
                crc = 0;
            }
            else
            {
                len--;
                uint ix;
                for (ix = 0; ix <= len; ix++)
                {
                    crc = (ushort) (crc ^ data[ix]);
                    uint iy;
                    for (iy = 0; iy <= 7; iy++)
                        if ((crc & 1) != 0)
                            crc = (ushort) ((crc >> 1) ^ 0xA001);
                        else
                            crc = (ushort) (crc >> 1); //
                }
            }

            var buf1 = (byte) ((crc & 0xff00) >> 8); //高位置
            var buf2 = (byte) (crc & 0x00ff); //低位置
            crc = (ushort) (buf1 << 8);
            crc += buf2;
            var strA = crc.ToString("x4");
            var result = StringToHexByte(strA);
            var b = new byte[2];
            b[0] = result[1];
            b[1] = result[0];
            return b;
        }
    }
}

 

-->ui

相關文章
相關標籤/搜索