2008-11-26 2 views
196

Можем ли мы преобразовать шестнадцатеричную строку в массив байтов, используя встроенную функцию в C#, или мне нужно сделать для этого специальный метод?Как преобразовать шестнадцатеричную строку в массив байтов?

+1

Вы можете легко преобразовать строку в Byte [] в одной строке: Var = ByteArray, Encoding.ASCII.GetBytes (string_with_your_data); – 2013-06-06 22:02:05

+9

@ mik-T, шестнадцатеричная строка находится в некотором формате, таком как 219098C10D7, который каждые два символа преобразует в один байт. ваш метод не используется. – AaA 2014-12-12 07:52:30

+2

Этот вопрос, похоже, не дублирует выбранный вопрос. этот преобразует из шестнадцатеричной строки в массив байтов, однако другой вопрос преобразует массив байтов в шестнадцатеричный. – AaA 2014-12-12 07:53:25

ответ

386

Вот хороший пример LINQ fun.

public static byte[] StringToByteArray(string hex) { 
    return Enumerable.Range(0, hex.Length) 
        .Where(x => x % 2 == 0) 
        .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
        .ToArray(); 
} 
+84

** Боже мой! ** Вы понимаете, как НЕФФИЦИЕНТ? Конечно, это весело, но LINQ слишком много используется для вещей, которые нужно сделать иначе! Для LINQ-кода требуется .NET 3.5 и требуется ссылка на System.Core (который в противном случае не нужен). См. Дублируемую статью для эффективных решений. – 2011-05-31 07:58:12

35
public static byte[] ConvertHexStringToByteArray(string hexString) 
{ 
    if (hexString.Length % 2 != 0) 
    { 
     throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString)); 
    } 

    byte[] HexAsBytes = new byte[hexString.Length/2]; 
    for (int index = 0; index < HexAsBytes.Length; index++) 
    { 
     string byteValue = hexString.Substring(index * 2, 2); 
     HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture); 
    } 

    return HexAsBytes; 
} 
54

Я сделал некоторые исследования и выяснили, что byte.Parse даже медленнее, чем Convert.ToByte. Самое быстрое преобразование, которое я мог бы использовать, использует приблизительно 15 тиков за байт.

public static byte[] StringToByteArrayFastest(string hex) { 
     if (hex.Length % 2 == 1) 
      throw new Exception("The binary key cannot have an odd number of digits"); 

     byte[] arr = new byte[hex.Length >> 1]; 

     for (int i = 0; i <hex.Length>> 1; ++i) 
     { 
      arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1]))); 
     } 

     return arr; 
    } 

    public static int GetHexVal(char hex) { 
     int val = (int)hex; 
     //For uppercase A-F letters: 
     return val - (val < 58 ? 48 : 55); 
     //For lowercase a-f letters: 
     //return val - (val < 58 ? 48 : 87); 
     //Or the two combined, but a bit slower: 
     //return val - (val < 58 ? 48 : (val < 97 ? 55 : 87)); 
    } 

// также работает на платформе .NET Micro Framework, где (в SDK4.3) byte.Parse (строка) допускает только целые форматы.

4

Я думаю, что это может сработать.

public static byte[] StrToByteArray(string str) 
    { 
     Dictionary<string, byte> hexindex = new Dictionary<string, byte>(); 
     for (int i = 0; i <= 255; i++) 
      hexindex.Add(i.ToString("X2"), (byte)i); 

     List<byte> hexres = new List<byte>(); 
     for (int i = 0; i < str.Length; i += 2)    
      hexres.Add(hexindex[str.Substring(i, 2)]); 

     return hexres.ToArray(); 
    } 
Смежные вопросы