将二进制长字符串转换为十六进制c#
我正在寻找将二进制长字符串转换为十六进制字符串的方法。将二进制长字符串转换为十六进制c#
二进制串看起来是这样的"0110011010010111001001110101011100110100001101101000011001010110001101101011"
我使用
hex = String.Format("{0:X2}", Convert.ToUInt64(hex, 2));
尝试,但只有当二进制串融入一个答:64该字符串是否足够长,它赢得了”工作吨。
是否有另一种方法将二进制字符串转换为十六进制?
谢谢
我只是把它敲了出来。也许你可以作为一个起点使用...
public static string BinaryStringToHexString(string binary)
{
StringBuilder result = new StringBuilder(binary.Length/8 + 1);
// TODO: check all 1's or 0's... Will throw otherwise
int mod4Len = binary.Length % 8;
if (mod4Len != 0)
{
// pad to length multiple of 8
binary = binary.PadLeft(((binary.Length/8) + 1) * 8, '0');
}
for (int i = 0; i < binary.Length; i += 8)
{
string eightBits = binary.Substring(i, 8);
result.AppendFormat("{0:X2}", Convert.ToByte(eightBits, 2));
}
return result.ToString();
}
非常有用,谢谢@米奇小麦。 – 2011-12-16 08:32:20
您可以一次输入四位数的数字。将这个数字转换为ex(就像你没有问题),然后将字符串连接在一起。因此,您可以从大小中获取一个代表十六进制数字的字符串。根据你的输入字符串开始MSB的位置,可能是你获得的输出字符串,我描述的方式必须是反转。
考虑四位可以由一个十六进制值来表示,可以通过简单的四组去和他们seperately转换,价值不会改变方式。
string bin = "11110110";
int rest = bin.Length % 4;
bin = bin.PadLeft(rest, '0'); //pad the length out to by divideable by 4
string output = "";
for(int i = 0; i <= bin.Length - 4; i +=4)
{
output += string.Format("{0:X}", Convert.ToByte(bin.Substring(i, 4), 2));
}
考虑到四位可以用一个十六进制值表示,您可以简单地按四个组进行转换并将它们单独转换,值不会以这种方式改变。
string bin = "11110110";
int rest = bin.Length % 4;
if(rest != 0)
bin = new string('0', 4-rest) + bin; //pad the length out to by divideable by 4
string output = "";
for(int i = 0; i <= bin.Length - 4; i +=4)
{
output += string.Format("{0:X}", Convert.ToByte(bin.Substring(i, 4), 2));
}
static string BinToHex(string bin)
{
if (bin == null)
throw new ArgumentNullException("bin");
if (bin.Length % 8 != 0)
throw new ArgumentException("The length must be a multiple of 8", "bin");
var hex = Enumerable.Range(0, bin.Length/8)
.Select(i => bin.Substring(8 * i, 8))
.Select(s => Convert.ToByte(s, 2))
.Select(b => b.ToString("x2"));
return String.Join(null, hex);
}
这可以帮助你:
string HexConverted(string strBinary)
{
string strHex = Convert.ToInt32(strBinary,2).ToString("X");
return strHex;
}
不错的兄弟比它为我工作..:D – rummykhan 2014-04-19 20:34:23
该问题涉及超过64位的字符串。 – 2014-09-18 17:52:33
Convert.ToInt32("1011", 2).ToString("X");
你能解释什么是'2',第二个参数 – Fazal 2016-04-30 06:48:56
'2'告诉'Convert.ToInt32'方法,提供的字符串是基数2.考虑将十六进制字符串“AABBCC”转换为“int”(这是'11189196'):简单地指定你的字符串是以16为底的,就像这样:'Convert.ToInt32(“AABBCC”,16)' – 2016-07-01 03:01:41
我想出了这个方法。我是新来的编程和C#,但我希望你会欣赏它:
static string BinToHex(string bin)
{
StringBuilder binary = new StringBuilder(bin);
bool isNegative = false;
if (binary[0] == '-')
{
isNegative = true;
binary.Remove(0, 1);
}
for (int i = 0, length = binary.Length; i < (4 - length % 4) % 4; i++) //padding leading zeros
{
binary.Insert(0, '0');
}
StringBuilder hexadecimal = new StringBuilder();
StringBuilder word = new StringBuilder("0000");
for (int i = 0; i < binary.Length; i += 4)
{
for (int j = i; j < i + 4; j++)
{
word[j % 4] = binary[j];
}
switch (word.ToString())
{
case "0000": hexadecimal.Append('0'); break;
case "0001": hexadecimal.Append('1'); break;
case "0010": hexadecimal.Append('2'); break;
case "0011": hexadecimal.Append('3'); break;
case "0100": hexadecimal.Append('4'); break;
case "0101": hexadecimal.Append('5'); break;
case "0110": hexadecimal.Append('6'); break;
case "0111": hexadecimal.Append('7'); break;
case "1000": hexadecimal.Append('8'); break;
case "1001": hexadecimal.Append('9'); break;
case "1010": hexadecimal.Append('A'); break;
case "1011": hexadecimal.Append('B'); break;
case "1100": hexadecimal.Append('C'); break;
case "1101": hexadecimal.Append('D'); break;
case "1110": hexadecimal.Append('E'); break;
case "1111": hexadecimal.Append('F'); break;
default:
return "Invalid number";
}
}
if (isNegative)
{
hexadecimal.Insert(0, '-');
}
return hexadecimal.ToString();
}
如果你想遍历每个字节的十六进制表示的字符串中,你可以使用以下扩展名。我把米奇的答案与this结合起来。
static class StringExtensions
{
public static IEnumerable<string> ToHex(this String s) {
if (s == null)
throw new ArgumentNullException("s");
int mod4Len = s.Length % 8;
if (mod4Len != 0)
{
// pad to length multiple of 8
s = s.PadLeft(((s.Length/8) + 1) * 8, '0');
}
int numBitsInByte = 8;
for (var i = 0; i < s.Length; i += numBitsInByte)
{
string eightBits = s.Substring(i, numBitsInByte);
yield return string.Format("{0:X2}", Convert.ToByte(eightBits, 2));
}
}
}
例子:
string test = "0110011010010111001001110101011100110100001101101000011001010110001101101011";
foreach (var hexVal in test.ToHex())
{
Console.WriteLine(hexVal);
}
打印
06
69
72
75
73
43
68
65
63
6B
如果你使用.NET 4.0或更高版本,如果你愿意使用System.Numerics.dll(为的BigInteger类),下面的解决方案工作正常:
public static string ConvertBigBinaryToHex(string bigBinary)
{
BigInteger bigInt = BigInteger.Zero;
int exponent = 0;
for (int i = bigBinary.Length - 1; i >= 0; i--, exponent++)
{
if (bigBinary[i] == '1')
bigInt += BigInteger.Pow(2, exponent);
}
return bigInt.ToString("X");
}
为什么w你是否期望'Convert.ToUInt64()'能够处理一个表示大于'UInt64'的值的字符串? – 2011-04-10 14:14:57