检查一个string,看看是否所有的字符都是hex值

C#2.0中最有效的方法是检查string中的每个字符,如果全部是有效的hex字符,则返回true,否则返回false。

void Test() { OnlyHexInString("123ABC"); // Returns true OnlyHexInString("123def"); // Returns true OnlyHexInString("123g"); // Returns false } bool OnlyHexInString(string text) { // Most efficient algorithm to check each digit in C# 2.0 goes here } 
 public bool OnlyHexInString(string test) { // For C-style hex notation (0xFF) you can use @"\A\b(0[xX])?[0-9a-fA-F]+\b\Z" return System.Text.RegularExpressions.Regex.IsMatch(test, @"\A\b[0-9a-fA-F]+\b\Z"); } 

像这样的东西:

(我不知道C#所以我不知道如何循环string的字符。)

 loop through the chars { bool is_hex_char = (current_char >= '0' && current_char <= '9') || (current_char >= 'a' && current_char <= 'f') || (current_char >= 'A' && current_char <= 'F'); if (!is_hex_char) { return false; } } return true; 

上面的逻辑代码

 private bool IsHex(IEnumerable<char> chars) { bool isHex; foreach(var c in chars) { isHex = ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')); if(!isHex) return false; } return true; } 

您可以对string执行TryParse以testing其整个string是否为hex数字。

如果它是一个特别长的string,你可以把它在大块,并通过它循环。

 // string hex = "bacg123"; Doesn't parse // string hex = "bac123"; Parses string hex = "bacg123"; long output; long.TryParse(hex, System.Globalization.NumberStyles.HexNumber, null, out output); 

以上是上述yjerem解决scheme的LINQ版本:

 private static bool IsValidHexString(IEnumerable<char> hexString) { return hexString.Select(currentCharacter => (currentCharacter >= '0' && currentCharacter <= '9') || (currentCharacter >= 'a' && currentCharacter <= 'f') || (currentCharacter >= 'A' && currentCharacter <= 'F')).All(isHexCharacter => isHexCharacter); } 

我使用Int32.TryParse()来做到这一点。 这是MSDN页面 。

张贴一个VB.NET版本的杰里米的答案 ,因为我来这里的时候正在寻找这样一个版本。 应该很容易将其转换为C#。

 ''' <summary> ''' Checks if a string contains ONLY hexadecimal digits. ''' </summary> ''' <param name="str">String to check.</param> ''' <returns> ''' True if string is a hexadecimal number, False if otherwise. ''' </returns> Public Function IsHex(ByVal str As String) As Boolean If String.IsNullOrWhiteSpace(str) Then _ Return False Dim i As Int32, c As Char If str.IndexOf("0x") = 0 Then _ str = str.Substring(2) While (i < str.Length) c = str.Chars(i) If Not (((c >= "0"c) AndAlso (c <= "9"c)) OrElse ((c >= "a"c) AndAlso (c <= "f"c)) OrElse ((c >= "A"c) AndAlso (c <= "F"c))) _ Then Return False Else i += 1 End If End While Return True End Function 

那么只是:

bool isHex = text.All("0123456789abcdefABCDEF".Contains);

这基本上说:检查是否在有效的hex值string中存在的textstring中的所有字符。

哪一个是最简单的可读解决scheme。

(不要忘记添加using System.Linq;

编辑:
只注意到Enumerable.All()仅在.NET 3.5以后才可用。

正则expression式在最好的时候效率不高。 最有效率的方法是使用plain for循环searchstring的字符,并findfind的第一个无效的字符。

但是, LINQ可以非常简洁地完成:

 bool isHex = myString.ToCharArray().Any(c => !"0123456789abcdefABCDEF".Contains(c)); 

我不能保证效率,因为LINQ是LINQ,但Any()应该有一个非常优化的编译scheme。

在性能方面,最快的可能只是列举人物并做一个简单的比较检查。

 bool OnlyHexInString(string text) { for (var i = 0; i < text.Length; i++) { var current = text[i]; if (!(Char.IsDigit(current) || (current >= 'a' && current <= 'f'))) { return false; } } return true; } 

要真正知道哪种方法是最快的,虽然你需要做一些分析。

  //Another workaround, although RegularExpressions is the best solution boolean OnlyHexInString(String text) { for(int i = 0; i < text.size(); i++) if( !Uri.IsHexDigit(text.charAt(i)) ) return false; return true; } 

程序员而言,最好的方法是调用你的平台的string到整数的parsing函数(比如Java的Integer.parseInt(str,base) ),看看是否有exception。 如果你想自己写,并可能有更多的时间/空间效率…

我想最有效率的就是每个angular色的查找表。 你将有一个2 ^ 8(或2 ^ 16的Unicode) – 布尔数组,如果它是一个有效的hex字符,则每个都是正确的 ,否则为false 。 代码看起来像(在Java中,对不起;-):

 boolean lut[256]={false,false,true,........} boolean OnlyHexInString(String text) { for(int i = 0; i < text.size(); i++) if(!lut[text.charAt(i)]) return false; return true; } 

这可以用正则expression式来完成,这是检查string是否匹配特定模式的有效方法。

一个hex数字可能的正则expression式是[A-Ha-h0-9] ,有些实现甚至有一个hex数字的特定代码,例如[[:xdigit:]]

你可以像这样扩展string和字符:

  public static bool IsHex(this string value) { return value.All(c => c.IsHex()); } public static bool IsHex(this char c) { c = Char.ToLower(c); if (Char.IsDigit(c) || (c >= 'a' && c <= 'f')) return true; else return false; } 

没有正则expression式的简单解决scheme是:

VB.NET:

 Public Function IsHexString(value As String) As Boolean Dim hx As String = "0123456789ABCDEF" For Each c As Char In value.ToUpper If Not hx.Contains(c) Then Return False Next Return True End Function 

或者在C#

 public bool IsHexString(string value) { string hx = "0123456789ABCDEF"; foreach (char c in value.ToUpper()) { if (!hx.Contains(c)) return false; } return true; } 

我用这个方法:

 public static bool IsHex(this char c) { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); } 

而这个作为C#扩展方法…

 public static class StringExtensions { public static bool IsHexString(this string str) { foreach (var c in str) { var isHex = ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')); if (!isHex) { return false; } } return true; } //bonus, verify whether a string can be parsed as byte[] public static bool IsParseableToByteArray(this string str) { return IsHexString(str) && str.Length % 2 == 0; } } 

像这样使用它…

 if("08c9b54d1099e73d121c4200168f252e6e75d215969d253e074a9457d0401cc6".IsHexString()) { //returns true... } 

我做了这个解决scheme来解决这个问题。 执行前检查请求string是否为空。

 for (int i = 0; i < Request.Length; i += 2) if (!byte.TryParse(string.Join("", Request.Skip(i).Take(2)), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out _)) return false; 

现在只

 if (IsHex(text)) { return true; } else { return false; }