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

时间:2016-07-10 14:50:12

标签: c#

假设我们有以下签名

void doSomething(string s)

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

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

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

我想做点什么

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以使用正则表达式来检查有效的十六进制字符串。但是为了做到这一点,你必须按原样提供十六进制表示法的字符串,即没有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}两个连续的十六进制数字 (...)+至少出现一个十六进制数字。
$行尾。