函数将hex字符串转换为BitArray C#

我创建了以下函数,它将按要求执行(将HEX字符串转换为BitArray)。 我不确定函数的效率,但我现在的主要问题是Convert.ToInt64函数是特定于endian的 。 当这被移植到备用芯片组时,我们将得到不同的结果(或例外)。 所以有人可以想到另一种方法来进行这种转换???

public BitArray convertHexToBitArray(string hexData) { string binary_values = ""; BitArray binary_array; if (hexData.Length <= "FFFFFFFFFFFFFFFF".Length) // Max Int64 { binary_values = Convert.ToString(Convert.ToInt64(hexData, 16), 2); binary_array = new BitArray(binary_values.Length); for (int i = 0; i < binary_array.Length; i++) { if (binary_values[i] == '0') { binary_array[i] = false; } else { binary_array[i] = true; } } } } 

我删除了大部分错误/exception处理,以保持这个大小,所以请原谅。

这是一个简单的答案,应该使用任何长度的字符串:

 public static BitArray ConvertHexToBitArray(string hexData) { if (hexData == null) return null; // or do something else, throw, ... BitArray ba = new BitArray(4 * hexData.Length); for (int i = 0; i < hexData.Length; i++) { byte b = byte.Parse(hexData[i].ToString(), NumberStyles.HexNumber); for (int j = 0; j < 4; j++) { ba.Set(i * 4 + j, (b & (1 << (3 - j))) != 0); } } return ba; } 

试试这个:

 var int64 = Int64.Parse(hexData, NumberStyles.HexNumber); var bytes = BitConverter.GetBytes(int64); var bitArray = new BitArray(bytes); 

我没有测试过这个(考虑一下pseduo代码),但它会很快:

  public static BitArray ConvertHexToBitArray(string hex) { Guard.AssertNotNullOrEmpty(hex, "hex"); Guard.AssertHex(hex, "hex"); var bits = new BitArray(hex.Length * 4); int pos = 0; foreach(char c in hex) { foreach(bool flag in LookupBits(c)) { bits.Set(pos, flag); pos++; } } return bits; } private static readonly Dictionary> _hexVsBits = CreateHexLookupTable(); private static Dictionary> CreateHexLookupTable() { var hexVsBits = new Dictionary>(); hexVsBits.Add('0', CreateBitsArray(false, false, false, false)); hexVsBits.Add('1', CreateBitsArray(false, false, false, true)); hexVsBits.Add('2', CreateBitsArray(false, false, true, false)); hexVsBits.Add('3', CreateBitsArray(false, false, true, true)); hexVsBits.Add('4', CreateBitsArray(false, true, false, false)); hexVsBits.Add('5', CreateBitsArray(false, true, false, true)); hexVsBits.Add('6', CreateBitsArray(false, true, true, false)); hexVsBits.Add('7', CreateBitsArray(false, true, true, true)); // complete hex table return hexVsBits; } private static List CreateBitsArray(bool msb, bool msbMinusOne, bool lsbPlusOne, bool lsb) { var bits = new List(4); bits.Add(msb); bits.Add(msbMinusOne); bits.Add(lsbPlusOne); bits.Add(lsb); return bits; } private static IEnumerable LookupBits(char hexValue) { return _hexVsBits[hexValue]; } } 

和卫兵:

 public static class Guard { public static void AssertHex(string value, string parameterName) { foreach(char entry in value) { if (!Char.IsNumber(entry)) { if (entry != 'a' && entry != 'A' && entry != 'b' && entry != 'B' && entry != 'c' && entry != 'C' && entry != 'd' && entry != 'D' && entry != 'e' && entry != 'E' && entry != 'f' && entry != 'F') { throw new ArgumentException("Not a valid hexidecimal number", parameterName); } } } } public static void AssertNotNullOrEmpty(string value, string parameterName) { if (string.IsNullOrEmpty(value)) throw new ArgumentNullException(parameterName); } }