颓废的郁闷 2022-07-11 10:48 采纳率: 100%
浏览 58
已结题

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里面,但代码不会写了。

  • 写回答

2条回答 默认 最新

  • wanghui0380 2022-07-11 12:15
    关注
    //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; } 
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月19日
  • 已采纳回答 7月11日
  • 创建了问题 7月11日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么