【问题标题】:Is there a way to differentiate a string argument between non-hexadecimal and a hexadecimal?有没有办法区分非十六进制和十六进制之间的字符串参数?
【发布时间】:2016-11-12 14:04:58
【问题描述】:

假设我们有以下签名

void doSomething(string s)

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

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

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

我想做类似的事情

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

【问题讨论】:

  • 我认为使用正则表达式会有所帮助;)。
  • 如果你想接受一个十六进制值,为什么不提供一个采用数字类型的重载呢?
  • 第二个字符串在源代码级别仅是十六进制,内容是您从这些值中获得的任何字符。你可以像“\x68\x65\x6C\x6C\x6F”这样写“你好”,这是完全无法区分的。因此,它不是链接问题的副本。真正的答案是“不,没有办法区分它们”,你必须想出别的办法。
  • @harold 你是对的。我尝试了那些以前的“重复”解决方案,但它们不起作用。该程序将原始十六进制视为“6\u0093h-E”(不完全是这种形式)。 IE。一切都是程序的字符串,所以它无法区分原始是否是十六进制。

标签: c#


【解决方案1】:

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

【讨论】:

  • 这是我的想法。
【解决方案2】:

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

【讨论】:

  • 这与问题所问的不同。 OP 询问是否可以确定一个字符串是否定义 带有十六进制字符(不是说他没有在他的示例字符串的开头使用@)。
猜你喜欢
  • 2019-07-27
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2018-01-19
  • 2017-08-12
  • 2014-03-26
相关资源
最近更新 更多