函数将十六进制字符串转换为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;
}
}
}
}
我删除了大部分的错误/异常处理,以保持这个大小,以便原谅。
这里是一个简单的答案,应该使用任意长度的字符串:
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);
我没有测试过这个(考虑它的代码),但它会很快:
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<char, List<bool>> _hexVsBits = CreateHexLookupTable();
private static Dictionary<char, List<bool>> CreateHexLookupTable()
{
var hexVsBits = new Dictionary<char, List<bool>>();
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<bool> CreateBitsArray(bool msb, bool msbMinusOne, bool lsbPlusOne, bool lsb)
{
var bits = new List<bool>(4);
bits.Add(msb);
bits.Add(msbMinusOne);
bits.Add(lsbPlusOne);
bits.Add(lsb);
return bits;
}
private static IEnumerable<bool> 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);
}
}
链接地址: http://www.djcxy.com/p/89827.html
上一篇: Function convert Hex String to BitArray C#
下一篇: How to convert numbers between hexadecimal and decimal in C#?