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



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

这是我在二进制中表示 1 的字符串: 字符串 = "000...0001";128 个字符。所有零直到最后 1

预期结果: bx000...0001;

这个问题是 128 位比普通类型(如整数、双精度、十进制等)大。因此,我相信您必须使用 BigInteger 类来保存此二进制值??

另一种构建方式:如何确保我的 BigInteger 值为 16 个字节大?

BigIntegerval = new BigInteger(1);//但必须精确为 16 字节。

您必须指定字节数并用 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"))}";
}

使用此答案中修改为跳过前导零而不强制使用符号零的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');

最新更新