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