我想写个函数,就是用来截取和转换用。
每秒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里面,但代码不会写了。
C#,如何截取字符串?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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无用
悬赏问题
- ¥100 set_link_state
- ¥15 虚幻5 UE美术毛发渲染
- ¥15 CVRP 图论 物流运输优化
- ¥15 Tableau online 嵌入ppt失败
- ¥100 支付宝网页转账系统不识别账号
- ¥15 基于单片机的靶位控制系统
- ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
- ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
- ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
- ¥15 手机接入宽带网线,如何释放宽带全部速度