我正在尝试将64位数字的十六进制表示(例如,字符串"FFFFFFFFF"
)转换为二进制表示("11111..."
)。
我试过
string result = Convert.ToString(Convert.ToUInt64(value, 16), 2);
但这会导致令人困惑的编译器错误:
'System.Convert.ToString(object,System.IFormatProvider)'的最佳重载方法匹配有一些无效的参数
参数2:无法从'int'转换为'System.IFormatProvider'
答案 0 :(得分:7)
以下代码有什么问题?
string hex = "FFFFFFFFFFFFFFFF";
// Returns -1
long longValue = Convert.ToInt64(hex, 16);
// Returns 1111111111111111111111111111111111111111111111111111111111111111
string binRepresentation = Convert.ToString(longValue, 2);
你写的几乎(只修复ulong
到long
演员),并返回你期望的内容。
编辑:
取消删除此答案,即使long
表示已签名,二进制表示实际上也是您所期望的。
答案 1 :(得分:3)
可能有更好的解决方案,但检查一下是否有效:
public static string HexToBinary(string hexValue)
{
ulong number = UInt64.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
byte[] bytes = BitConverter.GetBytes(number);
string binaryString = string.Empty;
foreach (byte singleByte in bytes)
{
binaryString += Convert.ToString(singleByte, 2);
}
return binaryString;
}
最方便的方法是使用Convert.ToString(Int64, Int32)
,但ulong没有超载。另一个解决方案是Convert.ToString(UInt64, IFormatProvider)
并编写您自己的IFormatProvider。通过查看示例,我找到了一个IFormatProvider,它以二进制,八进制和十六进制字符串表示格式化数字:http://msdn.microsoft.com/en-us/library/system.icustomformatter.aspx。
那里的代码与我提供的代码非常相似,所以我认为它不是一个糟糕的解决方案。
答案 2 :(得分:1)
最好的选择是:
public static string hex2bin(string value)
{
return Convert.ToString(Convert.ToInt32(value, 16), 2).PadLeft(value.Length * 4, '0');
}
答案 3 :(得分:0)
如果您使用this将十六进制字符串转换为BitArray,则生成二进制表示的任务非常简单:
BitArray barray = ConvertHexToBitArray(string hexData)
var sbuild = new StringBuilder();
for (int i = 0; i < barray.Length; i++)
{
sbuild.Append(barray[i] ? "1" : "0");
}
Console.WriteLine(sbuild.ToString());
答案 4 :(得分:0)
这是一个粗暴的方法,没有pancy 64bit限制:
string HexStringToBinary(string hexString)
{
var lup = new Dictionary<char, string>{
{ '0', "0000"},
{ '1', "0001"},
{ '2', "0010"},
{ '3', "0011"},
{ '4', "0100"},
{ '5', "0101"},
{ '6', "0110"},
{ '7', "0111"},
{ '8', "1000"},
{ '9', "1001"},
{ 'A', "1010"},
{ 'B', "1011"},
{ 'C', "1100"},
{ 'D', "1101"},
{ 'E', "1110"},
{ 'F', "1111"}};
var ret = string.Join("", from character in hexString
select lup[character]);
return ret;
}