feat(parser): 支持 Field1 的 0x/0X 十六进制前缀格式

This commit is contained in:
Scottxjw
2026-08-17 13:24:39 +08:00
parent 348d11c480
commit eba1d2080c

View File

@@ -21,15 +21,16 @@ public class PlossParser : IParser<PlossRecord>
// 第二行正则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<PlossRecord>
}
/// <summary>
/// 解析 Field1 的值支持十六进制格式0C、0xFF和普通十进制。
/// 含 a-f/A-F 字符时按十六进制解析,否则按十进制解析。
/// 解析 Field1 的值支持十六进制格式0C、0xFF、0xFF)和普通十进制。
/// 含 a-f/A-F/X 字符时按十六进制解析,否则按十进制解析;十六进制时先去掉 "0x"/"0X" 前缀
/// </summary>
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);
}
}