Преобразование длинной строки двоичного кода в hex С#
Я ищу способ преобразования длинной строки двоичного кода в шестую строку.
двоичная строка выглядит примерно так: "0110011010010111001001110101011100110100001101101000011001010110001101101011"
Я пробовал использовать
hex = String.Format("{0:X2}", Convert.ToUInt64(hex, 2));
но это работает только в том случае, если двоичная строка вписывается в Uint64, которая, если строка достаточно длинная, не будет.
есть ли другой способ преобразования строки двоичного кода в hex?
Спасибо
Ответы
Ответ 1
Я только что выбил это. Может быть, вы можете использовать в качестве отправной точки...
public static string BinaryStringToHexString(string binary)
{
if (string.IsNullOrEmpty(binary))
return binary;
StringBuilder result = new StringBuilder(binary.Length / 8 + 1);
// TODO: check all 1 or 0's... 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();
}
Ответ 2
Это может помочь вам:
string HexConverted(string strBinary)
{
string strHex = Convert.ToInt32(strBinary,2).ToString("X");
return strHex;
}
Ответ 3
Convert.ToInt32("1011", 2).ToString("X");
Если строка длиннее этой, вы можете просто разбить ее на несколько байтов:
var binary = "0110011010010111001001110101011100110100001101101000011001010110001101101011";
var hex = string.Join(" ",
Enumerable.Range(0, binary.Length / 8)
.Select(i => Convert.ToByte(binary.Substring(i * 8, 8), 2).ToString("X2")));
Ответ 4
Я придумал этот метод. Я новичок в программировании и С#, но я надеюсь, что вы по достоинству оцените его:
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();
}
Ответ 5
Учитывая, что четыре бита могут быть выражены одним шестнадцатеричным значением, вы можете просто перейти по группам из четырех и преобразовать их отдельно, значение не изменится таким образом.
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));
}
Ответ 6
Если вы используете .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");
}
Ответ 7
Учитывая, что четыре бита могут быть выражены одним шестнадцатеричным значением, вы можете просто перейти по группам из четырех и преобразовать их отдельно, значение не изменится таким образом.
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));
}
Ответ 8
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);
}
Ответ 9
Если вы хотите перебрать шестнадцатеричное представление каждого байта в строке, вы можете использовать следующее расширение. Я сочетал ответ Митча с этим.
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
Ответ 10
Вы можете ввести число ввода четыре цифры за раз. Преобразуйте эту цифру в ex (как вы делали, это нормально), затем соедините строку все вместе. Таким образом, вы получаете строку, представляющую число в шестнадцатеричном виде, независимо от размера. В зависимости от того, где начинается MSB на вашей входной строке, может быть строка вывода, которую вы получили, так, как я описал, должен быть отменен.