90 lines
3.6 KiB
C#
Raw Normal View History

2024-10-29 16:28:14 +08:00
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)
2024-11-06 16:48:44 +08:00
{
2024-10-29 16:28:14 +08:00
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
};
2024-11-07 19:39:05 +08:00
case CommandChunkEnum.Data:
2024-11-06 16:48:44 +08:00
var lenIndex = (int)CommandChunkEnum.Len;
var lenBin = (hexStringList[lenIndex + 1]+hexStringList[lenIndex]).HexToBin();
var len = lenBin.Remove(lenBin.Length - 2).BinToDec();
2024-11-07 19:39:05 +08:00
//验证长度 2=(帧校验和+结束字符)
if (hexStringList.Count - 2 != hearderLen + len)
return null;
2024-11-06 16:48:44 +08:00
var dataHexList = hexStringList.Skip(FixedLength).Take(len + hearderLen - FixedLength).ToList();
return dataHexList;
2024-10-29 16:28:14 +08:00
default:
throw new ArgumentOutOfRangeException(nameof(chunk), chunk, null);
}
}
}
}