using System.Globalization;
public static void Main()
string hex = "3018E51206F26DC000000002";
hex = "303400C0E4424C80009FE8D8";
BigInteger bigint = BigInteger.Parse(hex, NumberStyles.HexNumber);
Console.WriteLine("" + bigint.ToBinaryString());
Console.WriteLine("" + bigint.ToBinaryString().Length + " " + (bigint.ToBinaryString().Length / 4));
string bin = "01100000011010000000000110000001110010001000010010011001000000000000000100111111110100011011000";
string hex2 = BinaryStringToHexString(bin);
Console.WriteLine("" + hex2);
Console.WriteLine("" + BinaryStringToDecString(bin));
public static string BinaryStringToHexString(string binary)
if (string.IsNullOrEmpty(binary))
StringBuilder result = new StringBuilder(binary.Length / 8 + 1);
int mod4Len = binary.Length % 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();
public static BigInteger BinaryStringToDecString(string binary)
if (string.IsNullOrEmpty(binary))
if (binary.Count(b => b == '1') + binary.Count(b => b == '0') != binary.Length) return res;
foreach (var c in binary)
public static class BigIntegerExtensions
public static string ToBinaryString(this BigInteger bigint)
var bytes = bigint.ToByteArray();
var idx = bytes.Length - 1;
var base2 = new StringBuilder(bytes.Length * 8);
var binary = Convert.ToString(bytes[idx], 2);
if (binary[0] != '0' && bigint.Sign == 1)
for (idx--; idx >= 0; idx--)
base2.Append(Convert.ToString(bytes[idx], 2).PadLeft(8, '0'));
public static string ToHexadecimalString(this BigInteger bigint)
return bigint.ToString("X");
public static string ToOctalString(this BigInteger bigint)
var bytes = bigint.ToByteArray();
var idx = bytes.Length - 1;
var base8 = new StringBuilder(((bytes.Length / 3) + 1) * 8);
var extra = bytes.Length % 3;
for (; extra != 0; extra--)
var octal = Convert.ToString(int24, 8);
if (octal[0] != '0' && bigint.Sign == 1)
for (; idx >= 0; idx -= 3)
int24 = (bytes[idx] << 16) + (bytes[idx - 1] << 8) + bytes[idx - 2];
base8.Append(Convert.ToString(int24, 8).PadLeft(8, '0'));