using JiShe.CollectBus.Common.Enums; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using JiShe.CollectBus.Common.Models; using System.Runtime.CompilerServices; namespace JiShe.CollectBus.Common.Extensions { public static class HexStringExtensions { //起始字符 private const string startStr = "68"; //结束字符 private const string endStr = "16"; //头部字节长度 private const int hearderLen = 6; //消息认证码字段长度 private const int pWLen = 16; private const int tPLen = 6; private const int FixedLength = 18; public static object GetAnalyzeValue(this List hexStringList, CommandChunkEnum chunk) { if (hexStringList.Count < hearderLen || hexStringList[0] != startStr || hexStringList[5] != startStr || hexStringList.Count < FixedLength) { return null; } switch (chunk) { case CommandChunkEnum.AFN: var aFn = hexStringList[(int)CommandChunkEnum.AFN].HexToDec();//1字节 return aFn; case CommandChunkEnum.FN: //(DT2*8)+DT1=fn var dt1Bin = hexStringList[(int)CommandChunkEnum.FN - 1].HexToBin(); var dt1 = dt1Bin != "0" ? dt1Bin.Length : 0; var dt2 = hexStringList[(int)CommandChunkEnum.FN].HexToDec(); var fn = dt2 * 8 + dt1; return fn; case CommandChunkEnum.A: var aHexList = hexStringList.Skip((int)CommandChunkEnum.A).Take(5).ToList(); var a1 = aHexList[1] + aHexList[0]; var a2 = aHexList[3] + aHexList[2]; var a2Dec = a2.HexToDec(); var a3 = aHexList[4]; var a = $"{a1}{a2Dec.ToString().PadLeft(5, '0')}"; var a3Bin = aHexList[4].HexToBin().PadLeft(8, '0'); var msa = a3Bin.Substring(0, 7).BinToDec(); return new Tuple(a, msa); case CommandChunkEnum.SEQ: var seq = hexStringList[(int)CommandChunkEnum.SEQ].HexToBin().PadLeft(8, '0'); var tpV = (TpV)Convert.ToInt32(seq.Substring(0, 1)); var firfin = (FIRFIN)Convert.ToInt32(seq.Substring(1, 2)); var con = (CON)Convert.ToInt32(seq.Substring(3, 1)); var prseqBin = seq.Substring(4, 4); return new Seq { CON = con, FIRFIN = firfin, PRSEQ = prseqBin.BinToDec(), TpV = tpV }; case CommandChunkEnum.Data: var lenIndex = (int)CommandChunkEnum.Len; var lenBin = (hexStringList[lenIndex + 1]+hexStringList[lenIndex]).HexToBin(); var len = lenBin.Remove(lenBin.Length - 2).BinToDec(); var dataHexList = hexStringList.Skip(FixedLength).Take(len + hearderLen - FixedLength).ToList(); return dataHexList; default: throw new ArgumentOutOfRangeException(nameof(chunk), chunk, null); } } } }