You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HART协议字节码分割:仅在82/86前按FF序列拆分

HART协议字节码拆分:基于FF序列与后续标识的正则解决方案

问题描述

解析HART协议主从通信字节码时,需要按规则分拣数据:

  • 以82开头的是请求帧
  • 以86开头的是响应帧
  • 请求与响应之间可能存在任意数量的FF作为前导分隔符

现有拆分方式用包含不同数量FF组合的数组分割,存在两个核心问题:

  1. 帧内容中若包含FF,会被误判为分隔符导致拆分错误
  2. 新增更多FF组合既不优雅,还可能丢失关键标识

需求:仅当FF序列**后续紧跟82或86**时,才以此为边界拆分,拆分后保留82和86,可丢弃FF。

示例字节码

82 05 C6 00 46 5D 03 00 59  FF FF FF FF FF 86 05 C6 00 46 5D 03 1A 00 00 41 4C BE B2 3B 40 F6 4D B7 24 C2 23 B2 40 20 41 B5 BA 3D AA 7F A0 00 00 20 FF FF FF FF 
82 05 C6 00 46 5D 03 00 59     FF FF FF FF 86 05 C6 00 46 5D 03 1A 00 00 41 4C BE D5 3B 40 F6 4D F5 24 C2 23 B2 40 20 41 B5 63 04 AA 7F A0 00 00 E5 FF FF FF FF 
82 05 C6 00 46 5D 03 00 59  FF FF FF FF FF 86 05 C6 00 46 5D 03 1A 00 00 41 4C BE F6 3B 40 F6 4E 2E 24 C2 23 B2 40 20 41 B5 76 E7 AA 7F A0 00 00 E8 FF FF FF FF 
82 05 C6 00 46 5D 03 00 59  FF FF FF FF FF 86 05 C6 00 46 5D 03 1A 00 00 41 4C BF 01 3B 40 F6 4E 41 24 C2 23 B2 40 20 41 B5 67 34 AA 7F A0 00 00 B3 FF FF FF FF

原有问题代码

string[] delimiterChars = {
    "FF FF FF FF FF FF FF FF FF FF ",
    "FF FF FF FF FF FF FF FF FF ",
    "FF FF FF FF FF FF FF FF ",
    "FF FF FF FF FF FF FF ",
    "FF FF FF FF FF FF ",
    "FF FF FF FF FF ",
    "FF FF FF FF ",
    "FF FF FF ",
    "FF FF ",
    "FF "
};

string[] words = OnlyHex.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);

解决方案:正则表达式实现精准拆分

利用正则的正向预查特性,匹配任意数量的FF序列,且要求该序列后面紧跟82或86,以此作为拆分边界,避免误拆分帧内的FF。

具体实现代码

using System;
using System.Text.RegularExpressions;

class HartParser
{
    static void Main()
    {
        string input = @"82 05 C6 00 46 5D 03 00 59  FF FF FF FF FF 86 05 C6 00 46 5D 03 1A 00 00 41 4C BE B2 3B 40 F6 4D B7 24 C2 23 B2 40 20 41 B5 BA 3D AA 7F A0 00 00 20 FF FF FF FF 
82 05 C6 00 46 5D 03 00 59     FF FF FF FF 86 05 C6 00 46 5D 03 1A 00 00 41 4C BE D5 3B 40 F6 4D F5 24 C2 23 B2 40 20 41 B5 63 04 AA 7F A0 00 00 E5 FF FF FF FF 
82 05 C6 00 46 5D 03 00 59  FF FF FF FF FF 86 05 C6 00 46 5D 03 1A 00 00 41 4C BE F6 3B 40 F6 4E 2E 24 C2 23 B2 40 20 41 B5 76 E7 AA 7F A0 00 00 E8 FF FF FF FF 
82 05 C6 00 46 5D 03 00 59  FF FF FF FF FF 86 05 C6 00 46 5D 03 1A 00 00 41 4C BF 01 3B 40 F6 4E 41 24 C2 23 B2 40 20 41 B5 67 34 AA 7F A0 00 00 B3 FF FF FF FF";

        // 正则表达式:匹配任意数量的FF(带空格分隔),且后面紧跟82或86
        string pattern = @"(FF\s+)+(?=(82|86)\s)";
        
        // 拆分字符串,移除空项
        string[] frames = Regex.Split(input, pattern, RegexOptions.IgnorePatternWhitespace);
        
        // 过滤掉匹配过程中产生的捕获组内容,只保留有效帧
        frames = Array.FindAll(frames, frame => !string.IsNullOrWhiteSpace(frame) && (frame.StartsWith("82") || frame.StartsWith("86")));
        
        // 输出结果
        foreach (var frame in frames)
        {
            Console.WriteLine(frame.Trim());
        }
    }
}

正则表达式解释

  • (FF\s+)+:匹配一个或多个连续的FF,每个FF后跟一个或多个空白符(空格、换行等)
  • (?=(82|86)\s):正向预查,确保当前匹配的FF序列后面紧跟82或86,且82/86后有空白符,避免误匹配包含82的其他字节组合
  • RegexOptions.IgnorePatternWhitespace:允许正则表达式中添加空白,提升可读性,不影响匹配逻辑

效果说明

  • 仅拆分作为分隔符的FF序列(即后面紧跟82/86的FF)
  • 帧内容中包含的FF会被完整保留,不会误拆分
  • 拆分后每一项都是完整的请求帧(82开头)或响应帧(86开头)

内容的提问来源于stack exchange,提问作者SideSky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:35:20