如何在C#中将二进制字符串解析为二进制文字

时间:2018-05-15 20:47:20

标签: c# encryption binary cryptography biginteger

这是我的具体问题。我需要将一个整数(如1,2,3,..)表示为具有128位的二进制文字。

这是我的二进制代表1的字符串: string =“000 ... 0001”; // 128个字符全部为零直到最后1

预期结果: bx000 ... 0001;

这个问题是128位大于普通类型,如int,double,decimal等。因此,我相信你必须使用BigInteger类来保存这个二进制值吗?

构建此框架的另一种方法:如何确保我的BigInteger值大16字节?

BigInteger val = new BigInteger(1); //但必须完全是16个字节。

2 个答案:

答案 0 :(得分:0)

您必须指定字节数并填充0的缺失,然后您可以使用BitArray获取位值。这样的事情。

public static string GetBitString(BigInteger val, int bytes)
{
    byte[] arrayBytes = new byte[bytes];
    var valBytes = val.ToByteArray();
    for (var i = 0; i < valBytes.Length; i++)
    {
        arrayBytes[i] = valBytes[i];
    }
    var arr = new BitArray(arrayBytes);
    return $"bx{string.Join("", arr.Cast<bool>().Reverse().Select(c => c ? "1" : "0"))}";
}

另一个选择是将创建的数组大小调整为16个字节。像这样的东西

public static string GetBitString(BigInteger val, int bytes)
{
    var valBytes = val.ToByteArray();
    Array.Resize(ref valBytes, bytes);
    return $"bx{string.Join("", new BitArray(valBytes).Cast<bool>().Reverse().Select(c => c ? "1" : "0"))}";
}

答案 1 :(得分:0)

使用this answer修改后的ToBinaryString扩展方法跳过前导零并且不强制使用零符号,您可以使用PadLeft确保您拥有前导零:

public static string ToBinaryString(this BigInteger bigint) {
    var bytes = bigint.ToByteArray();

    // Create a StringBuilder having appropriate capacity.
    var base2 = new StringBuilder(bytes.Length * 8);

    // Convert remaining bytes adding leading zeros.
    var idx = bytes.Length - 1;
    for (; idx > 0 && bytes[idx] == 0; --idx)
        ;
    for (; idx >= 0; --idx)
        base2.Append(Convert.ToString(bytes[idx], 2).PadLeft(8, '0'));

    return base2.ToString();
}

然后使用前缀和左边距:

var ans = "bx"+val.ToBinaryString().PadLeft(128, '0');