using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BatCharging.Service { public class MsgBits { /// /// 将一个字节转换到二进制字节数组.(高位在位数组低索引位,低位在位数组高索引位) /// /// 需转换字节 /// 二进制字节数组 private static byte[] ToFullBinaryBytes(byte num) { byte[] rst = new byte[8]; for (int i = 0; i < 8; i++) { rst[i] = (byte)((num >> i & 1)); } return rst; } /// /// 得到字节中单Bit的值(高字节在数组低索引位,低字节在数组高索引位) /// /// 字节数组 /// 字节位置:数组中第几个字节(从0开始) /// Bit在字节中的位置:第几位(从0开始) /// 返回字节结果,byte:1,0 public static byte ByteToBitValue(byte[] data, int byteAddr, int bitStartAddr) { byte result = 9; if (data.Count() >= (byteAddr + 1)) { byte value = data[byteAddr]; result = ToFullBinaryBytes(value)[bitStartAddr]; } return result; } /// /// 得到字节中Bit组合的值,高位在前,低位在后(高字节在数组低索引位,低字节在数组高索引位) /// /// 字节数组 /// 字节位置:数组中第几个字节(从0开始) /// Bit在字节中的位置:第几位(从0开始) /// Bit在字节中的位数 /// 返回字节结果,byte:1,0 public static byte ByteToBitsValue(byte[] data, int byteAddr, int bitStartAddr, int bitOffset) { byte result = 9; if (data.Count() >= (byteAddr + 1)) { byte value = data[byteAddr]; if ((bitStartAddr + bitOffset) <= 8) { byte temp = 0; for (int i = bitStartAddr; i < bitStartAddr + bitOffset; i++) { temp += (byte)(((value >> i & 1)) << (i - bitStartAddr)); } result = temp; } } return result; } /// /// 根据高位优先的原理的两字节数据解析返回一个16位无符号整数(高字节在数组低索引位,低字节在数组高索引位) /// /// 原字节数组 /// 缓冲区偏移 /// 返回无符号整数 public static ushort ToUInt16(byte[] value, int offset) { return (ushort)((value[offset] << 8) + value[offset + 1]); } /// /// 将字符串转换成字节数组(主要应用于车牌) /// /// 字符串 /// 字节数组 public static byte[] StrToBytes(string StrSrc) { byte[] byteResults = null; List lstBytes = null; if (StrSrc != null) { if (StrSrc.Trim() != "") { lstBytes = new List(); int iLength = StrSrc.Length; for (int i = 0; i < iLength; i++) { char chr = Convert.ToChar(StrSrc.Substring(i, 1)); int iChr = (int)chr; if (iChr >= 256) { byte b1 = Convert.ToByte(iChr >> 8); lstBytes.Add(b1); byte b2 = Convert.ToByte(iChr % 256); lstBytes.Add(b2); } else { lstBytes.Add(Convert.ToByte(iChr)); } } byteResults = lstBytes.ToArray(); } } return byteResults; } } }