From eba1d2080cf81978ead1d9758666a224eb561239 Mon Sep 17 00:00:00 2001 From: Scottxjw <13374147+scottxjw@user.noreply.gitee.com> Date: Mon, 17 Aug 2026 13:24:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(parser):=20=E6=94=AF=E6=8C=81=20Field1=20?= =?UTF-8?q?=E7=9A=84=200x/0X=20=E5=8D=81=E5=85=AD=E8=BF=9B=E5=88=B6?= =?UTF-8?q?=E5=89=8D=E7=BC=80=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Application/Parsing/PlossParser.cs | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Gpulse.WCT.DataAnalyzer.Core/Application/Parsing/PlossParser.cs b/src/Gpulse.WCT.DataAnalyzer.Core/Application/Parsing/PlossParser.cs index 1b8fccf..9c2de79 100644 --- a/src/Gpulse.WCT.DataAnalyzer.Core/Application/Parsing/PlossParser.cs +++ b/src/Gpulse.WCT.DataAnalyzer.Core/Application/Parsing/PlossParser.cs @@ -21,15 +21,16 @@ public class PlossParser : IParser // 第二行正则:FOD-> 后跟16个字段 // Field1 支持十六进制格式(0X/0x 前缀,如 0C、0xFF)或普通十进制; // 其余字段为十进制整数(均支持负数)。 - // Field1 用捕获组是为了方便从 Match 取值(解析逻辑见 ParseFieldValue)。 + // 共 16 个捕获组(Field1 文本 + Field2..Field16),对应 PlossRecord 的 Field1..Field16。 private static readonly Regex FodPattern = new( - @"^FOD->\s+(0[0-9A-Fa-f]+|-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)$", + @"^FOD->\s+(0[xX][0-9A-Fa-f]+|0[0-9A-Fa-f]+|-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)$", RegexOptions.Compiled ); // 旧格式正则(兼容):前3个字段被忽略,所有捕获组支持负数;Field1 兼容十六进制 + // 共 14 个捕获组(Field1 文本 + 13 个 (-?\d+)),对应旧格式 14 个原始字段(含前3个占位字段) private static readonly Regex LegacyPattern = new( - @"^FOD->\s+(0[0-9A-Fa-f]+|-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)$", + @"^FOD->\s+(0[xX][0-9A-Fa-f]+|0[0-9A-Fa-f]+|-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)$", RegexOptions.Compiled ); @@ -239,11 +240,20 @@ public class PlossParser : IParser } /// - /// 解析 Field1 的值,支持十六进制格式(0C、0xFF)和普通十进制。 - /// 含 a-f/A-F 字符时按十六进制解析,否则按十进制解析。 + /// 解析 Field1 的值,支持十六进制格式(0C、0xFF、0xFF)和普通十进制。 + /// 含 a-f/A-F/X 字符时按十六进制解析,否则按十进制解析;十六进制时先去掉 "0x"/"0X" 前缀。 /// - private static int ParseFieldValue(string value) => - value.AsSpan().IndexOfAny("abcdefABCDEF".AsSpan()) >= 0 - ? int.Parse(value, NumberStyles.HexNumber) - : int.Parse(value); + private static int ParseFieldValue(string value) + { + // 含十六进制字符(A-F/a-f)或显式 0x 前缀时按十六进制解析 + bool isHex = value.AsSpan().IndexOfAny("abcdefABCDEFxX".AsSpan()) >= 0; + if (!isHex) + return int.Parse(value); + + // 去掉可选的 0x/0X 前缀(NumberStyles.HexNumber 不接受前缀) + var span = value.AsSpan(); + if (span.Length > 2 && (span[1] == 'x' || span[1] == 'X') && span[0] == '0') + span = span[2..]; + return int.Parse(span, NumberStyles.HexNumber); + } } \ No newline at end of file