feat(parser): 支持 Field1 的 0x/0X 十六进制前缀格式
This commit is contained in:
@@ -21,15 +21,16 @@ public class PlossParser : IParser<PlossRecord>
|
|||||||
// 第二行正则:FOD-> 后跟16个字段
|
// 第二行正则:FOD-> 后跟16个字段
|
||||||
// Field1 支持十六进制格式(0X/0x 前缀,如 0C、0xFF)或普通十进制;
|
// Field1 支持十六进制格式(0X/0x 前缀,如 0C、0xFF)或普通十进制;
|
||||||
// 其余字段为十进制整数(均支持负数)。
|
// 其余字段为十进制整数(均支持负数)。
|
||||||
// Field1 用捕获组是为了方便从 Match 取值(解析逻辑见 ParseFieldValue)。
|
// 共 16 个捕获组(Field1 文本 + Field2..Field16),对应 PlossRecord 的 Field1..Field16。
|
||||||
private static readonly Regex FodPattern = new(
|
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
|
RegexOptions.Compiled
|
||||||
);
|
);
|
||||||
|
|
||||||
// 旧格式正则(兼容):前3个字段被忽略,所有捕获组支持负数;Field1 兼容十六进制
|
// 旧格式正则(兼容):前3个字段被忽略,所有捕获组支持负数;Field1 兼容十六进制
|
||||||
|
// 共 14 个捕获组(Field1 文本 + 13 个 (-?\d+)),对应旧格式 14 个原始字段(含前3个占位字段)
|
||||||
private static readonly Regex LegacyPattern = new(
|
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
|
RegexOptions.Compiled
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -239,11 +240,20 @@ public class PlossParser : IParser<PlossRecord>
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 解析 Field1 的值,支持十六进制格式(0C、0xFF)和普通十进制。
|
/// 解析 Field1 的值,支持十六进制格式(0C、0xFF、0xFF)和普通十进制。
|
||||||
/// 含 a-f/A-F 字符时按十六进制解析,否则按十进制解析。
|
/// 含 a-f/A-F/X 字符时按十六进制解析,否则按十进制解析;十六进制时先去掉 "0x"/"0X" 前缀。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static int ParseFieldValue(string value) =>
|
private static int ParseFieldValue(string value)
|
||||||
value.AsSpan().IndexOfAny("abcdefABCDEF".AsSpan()) >= 0
|
{
|
||||||
? int.Parse(value, NumberStyles.HexNumber)
|
// 含十六进制字符(A-F/a-f)或显式 0x 前缀时按十六进制解析
|
||||||
: int.Parse(value);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user