有没有办法区分非十六进制和十六进制之间的字符串参数

本文关键字:十六进制 之间 字符串 参数 有没有 法区 | 更新日期: 2023-09-27 17:56:16

假设我们有以下签名

void doSomething(string s)

当用户调用函数时,他们可以调用

doSomething("hello")doSomething("'x15'x3C'xFF")

有没有办法判断参数何时是第二种形式,即十六进制值?

我想做类似的事情

if(isHex(s))     
    // do this
else
    // do that

有没有办法区分非十六进制和十六进制之间的字符串参数

No.这是不可能的。对于运行时环境,字符串本质上只是一个字符数组(本质上只是一个字节的集合)。它不知道这些字符最初是如何以纯文本或转义的十六进制序列表示的。

您可以使用正则表达式来检查有效的十六进制字符串。但是为了做到这一点,你必须按原样以十六进制表示法提供字符串,即没有 C# 的解释和转换为普通字符串。为此使用逐字字符串(由"@"引入):

string s =  @"'x15'x3C'xFF";

在逐字字符串中,反斜杠不会被 c# 解释为转义字符。但这样做的缺点是,当然,您不再获得预期的结果字符串。

public static bool IsHexString(string s)
{
    return Regex.IsMatch(s, @"^(''x[0-9A-F]{2})+$");
}

正则表达式的说明:

^字符串的开头。
''转义了反斜杠("'")。这里不是 C# 转义,而是正则表达式转义。
x字母"x"。
[0-9A-F]{2}两个连续的十六进制数字。
(...)+至少出现一次十六进制数。
$行尾。