这是我的具体问题。我需要将一个整数(如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个字节。
答案 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');