Come posso convertire una stringa esadecimale in un array di byte?

Possiamo convertire una stringa esadecimale in un array di byte usando una funzione incorporata in C # o devo fare un metodo personalizzato per questo?

Ecco un divertente esempio LINQ.

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(); } 

Ho fatto qualche ricerca e ho scoperto che byte.Parse è ancora più lento di Convert.ToByte. La conversione più veloce che potrei ottenere utilizza circa 15 tick per byte.

  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 AF letters: return val - (val < 58 ? 48 : 55); //For lowercase af letters: //return val - (val < 58 ? 48 : 87); //Or the two combined, but a bit slower: //return val - (val < 58 ? 48 : (val < 97 ? 55 : 87)); } 

// funziona anche su .NET Micro Framework dove (in SDK4.3) byte.Parse (string) consente solo formati interi.

Il seguente codice modifica la stringa esadecimale in una matrice di byte analizzando la stringa byte per byte.

 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[] data = new byte[hexString.Length / 2]; for (int index = 0; index < data.Length; index++) { string byteValue = hexString.Substring(index * 2, 2); data[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture); } return data; } 

Penso che questo possa funzionare.

 public static byte[] StrToByteArray(string str) { Dictionary hexindex = new Dictionary(); for (int i = 0; i <= 255; i++) hexindex.Add(i.ToString("X2"), (byte)i); List hexres = new List(); for (int i = 0; i < str.Length; i += 2) hexres.Add(hexindex[str.Substring(i, 2)]); return hexres.ToArray(); }