将二进制长字符串转换为十六进制c#

将二进制长字符串转换为十六进制c#,c#,binary,hex,C#,Binary,Hex,我正在寻找一种将长字符串二进制转换为十六进制字符串的方法 二进制字符串类似于以下内容“01100110110010111001001110101011100110010000101101000010110001100001100110001101011” 我试过使用 hex = String.Format("{0:X2}", Convert.ToUInt64(hex, 2)); 但这只有在二进制字符串适合Uint64时才起作用,如果字符串足够长,它就不会 是否有其他方法将二进制字符串转换为十六

我正在寻找一种将长字符串二进制转换为十六进制字符串的方法

二进制字符串类似于以下内容
“01100110110010111001001110101011100110010000101101000010110001100001100110001101011”

我试过使用

hex = String.Format("{0:X2}", Convert.ToUInt64(hex, 2));
但这只有在二进制字符串适合Uint64时才起作用,如果字符串足够长,它就不会

是否有其他方法将二进制字符串转换为十六进制


谢谢

您可以一次输入四位数字。将这个数字转换为ex(正如您所做的那样),然后将字符串全部合并。因此,您将获得一个以十六进制表示数字的字符串,该字符串独立于大小。根据输入字符串上起始MSB的位置,可能是您按照我描述的方式获得的输出字符串,必须颠倒。

我刚刚搞定了这个。也许你可以用它作为起点

public static string BinaryStringToHexString(string binary)
{
    if (string.IsNullOrEmpty(binary))
        return binary;

    StringBuilder result = new StringBuilder(binary.Length / 8 + 1);

    // TODO: check all 1's 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();
}
公共静态字符串BinaryStringToHexString(字符串二进制)
{
if(string.IsNullOrEmpty(二进制))
返回二进制;
StringBuilder结果=新的StringBuilder(binary.Length/8+1);
//TODO:检查所有1或0…否则抛出
int mod4Len=二进制。长度%8;
如果(mod4Len!=0)
{
//焊盘到长度的倍数为8
binary=binary.PadLeft(((binary.Length/8)+1)*8,'0');
}
对于(int i=0;i
考虑到四位可以用一个十六进制值来表示,您只需按四个一组分别进行转换,值不会以这种方式改变

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));
}
string bin=“11110110”;
int rest=bin.Length%4;
bin=bin.PadLeft(其余为“0”)//将长度向外填充到可除以4的位置
字符串输出=”;

对于(int i=0;i考虑到四位可以用一个十六进制值表示,您只需按四个一组分别进行转换,值不会以这种方式改变

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));
}
string bin=“11110110”;
int rest=bin.Length%4;
如果(rest!=0)
bin=新字符串('0',4-rest)+bin;//将长度填充到可除以4的位置
字符串输出=”;
对于(int i=0;i这可能会帮助您:

string HexConverted(string strBinary)
    {
        string strHex = Convert.ToInt32(strBinary,2).ToString("X");
        return strHex;
    }
对于长度超过此值的字符串,您可以简单地将其拆分为多个字节:

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")));

我想出了这个方法。我对编程和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();
}
静态字符串BinToHex(字符串bin)
{
StringBuilder二进制文件=新的StringBuilder(bin);
bool为阴性=假;
如果(二进制[0]='-')
{
isNegative=true;
二进制。删除(0,1);
}
对于(int i=0,length=binary.length;i<(4-长度%4)%4;i++)//填充前导零
{
二进制。插入(0,'0');
}
StringBuilder十六进制=新的StringBuilder();
StringBuilder word=新StringBuilder(“0000”);
对于(int i=0;i
如果要迭代字符串中每个字节的十六进制表示形式,可以使用以下扩展名。我将Mitch的答案与

印刷品

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");
}

为什么希望
Convert.ToUInt64()能够处理一个大于一个值大于一个值的字符串UIT64 64 /代码>可以保存吗?问题是关于超过64位的字符串。请解释什么是“2”,第二个参数“2'告诉了<代码>皈依。ToTun32</Case>方法提供的字符串是基2。考虑转换一个十六进制字符串<代码>。“AABBCC”到
int`(即
11189196
):只需指定字符串以16为基数,如下所示:
Convert.ToInt32(“AABBCC”,16)
问题是字符串中包含的数字超过64位,因此您的解决方案不会出现错误work@Jesper,为答案添加了更多细节。感谢您指出这一点。我认为“否则扔掉“在TODO中,我被甩了。看到带有TODO的答案对我来说似乎很奇怪。你能解释一下吗?我不明白为什么这种方法在这些情况下需要抛出。此外,如果二进制为null,则会出现null引用,但这可能是你的意图。在这些情况下,我可能会添加一个保护以返回null。谢谢!“看到带有TODO的答案对我来说似乎很奇怪:-一点也不。我假设OP可以添加他们认为必要的守卫。我看不到他们的调用代码,也不知道他们的全部用例意图。空检查当然是谨慎的;我会添加一个。。。
06
69
72
75
73
43
68
65
63
6B
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");
}