79 lines
3.0 KiB
C#
79 lines
3.0 KiB
C#
|
|
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<string> 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<string,int>(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
|
|||
|
|
};
|
|||
|
|
default:
|
|||
|
|
throw new ArgumentOutOfRangeException(nameof(chunk), chunk, null);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|