C#,如何截取字符串?

我想写个函数,就是用来截取和转换用。
每秒UDP方式接收数据,接收到的数据都是HEX,比如,FF 01 AA 56 8B 00 60 00 08 F7 08 F4 00 31 00等等(总长度145字节,每个或者每几个字节代表不同数据)
拆分的格式,要按照固定格式来截取,
比如,开始,1-4的字节,FF 01 AA 56表示头,8B 00的第5-6字节表示内容,60的第7字节表示命令,00的第8字节表示地址,08的第9字节表示序号,F7 08的第10、11字节表示220V电压,F4 00的第12、13字节表示24V电压,31 00的第14、15字节表示5V电压。想问下我想把这个大的字符串拆解并转换成10进制之后然后显示出来,不知道代码怎么写了。
比如,解析后的电压显示就是:227.0V,24.4V,4.9V。温度分别是:40.6℃,42.8℃,42.1℃等等因为大字符串有了,就是按照4 2 1 1 1 2 2 2 1 1 2 2 2 2 2 2 1 1 1 1 2的这种格式分别截取出来后,在转成10进制数值后,并显示出来,比如,截取后,220V电压是F7 08,转换后计算器里DEC显示的是2295,按照单位是0.1V算,结果就是229.5V,显示到combbox或者list、text上。我初步的想法是,定义俩数组,A数组是存放截取位数的,比如4 2 1 1 1 2 2 2 1 1 2 2 2 2 2 2 1 1 1 1 2的B数组是按照每次从A取一个数字,然后从B中取相应的字节数后放到B里面,但代码不会写了。

//udp包没有粘包,所以直接解析,但是没有具体协议描述,我们就事论事写
//只告诉你我们平时怎么处理这类东西
byte[] buffer = new byte[] { 0xFF, 0x01, 0xAA, 0x56, 0x8B, 0x00, 0x60, 0x00, 0x08, 0xF7, 0x08, 0xF4, 0x00, 0x31, 0x00 };

var res = tryParsePackag(new ReadOnlySequence<byte>(buffer));
var b = 1;

(bool, Package) tryParsePackag(ReadOnlySequence<byte> buffer)
 {
     SequenceReader<byte> reader = new SequenceReader<byte>(buffer);
     Package temp = new Package();
     //尝试读取头
     if (reader.TryAdvanceToAny(new ReadOnlySpan<byte>(temp.head)))
     {
         //如果读能读到头,把指针向前移动3格,因为前一句其实已经移动到头的位置,所以此时只需移动3格
         reader.Advance(temp.head.Length-1);
         //内容2字节,我们尝试读取2字节,
         if (reader.TryCopyTo(new Span<byte>(temp.内容)))
         {
            //继续往下读,当然这样的东西我们可以看成职责链pipeline,只是我这里就不演示职责链了
            //好了基本操作你大概就明白了,我就不多写了
            //我们直接跳到电压,当然理论上我们会根据第7字节表示命令,跳到另外一个职责链上,不过我们也懒得写那么多,就直接演示电压

            reader.Advance(5);//懒得解析中间那串了,直接前跳5位
            if (reader.TryCopyTo(new Span<byte>(temp.电压字节)))
            {
                //根据你的描述这个是小端数据,我们直接用bitconvet
              
                temp.电压 = (short)(BitConverter.ToUInt16(temp.电压字节) / (short)10);

                return (true, temp);
            }

        }
    }
     return (false, null);
 }

Console.ReadKey();

public class Package
{
  
    public byte[] head { get; set; } = new byte[] { 0xFF, 0x01, 0xAA, 0x56 };
    public byte[] 内容{ get; set; } = new byte[2];

    public byte[] 电压字节 { get; set; } = new byte[2];


    //理论上需要根据命令,内容确定是否具体使用特定类型去解码数据
    //这里我就不折腾了,直接转换出数据
    public short 电压 { get; set; } 
}

c#截取字符串用的是Substring方法,具体可学习一下:https://www.cnblogs.com/lydj/p/15420694.html