gpt4 book ai didi

Java 的 BigInteger C# 以 Base 32 表示

转载 作者:行者123 更新时间:2023-11-30 02:50:25 33 4
gpt4 key购买 nike

如何将下面一行 Java 代码转换为 C# 代码。它生成一个 130 位大小的随机 BigInteger,将其转换为基数 32 的字符串(即不是十进制),然后操作该字符串:

new BigInteger(130, new SecureRandom()).toString(32).replace("/", "w").toUpperCase(Locale.US);

如何在 C# 中实现这一目标?

  • 生成一个随机的 130 位 BigInteger
  • 将其转换为以 32 为基数的字符串

就随机 BigInteger 而言,我有这个函数:

static BigInteger RandomInteger(int bits)
{
RNGCryptoServiceProvider secureRandom = new RNGCryptoServiceProvider();
// make sure there is extra room for a 0-byte so our number isn't negative
// in the case that the msb is set
var bytes = new byte[bits / 8 + 1];
secureRandom.GetBytes(bytes);
// mask off excess bits
bytes[bytes.Length - 1] &= (byte)((1 << (bits % 8)) - 1);
return new BigInteger(bytes);
}

取自这个问题,它没有解决基数 32 转换:Equivalent of Java's BigInteger in C#

但是我不确定该函数是否正确。

到目前为止我拥有的 C# 代码,RandomInteger 是上面描述的函数:

RandomInteger(130).ToString().Replace("/","w").ToUpper(CultureInfo.GetCultureInfo("en-US"));

最佳答案

上面的代码有相当多的错误,如果位是整数,最后一个数字会被完全屏蔽,并且数字有可能变为正数,因为新的 BigInteger(byte[]) 重载需要一个小字节序有符号数字,所以你必须在它前面加上 0 字节

    static BigInteger RandomInteger(int bits)
{
var bytes = new byte[(bits + 7) / 8 + 1];

using (var rng = new RNGCryptoServiceProvider())
rng.GetBytes(bytes, 0, bytes.Length - 1);

var remainingBits = bits % 8;

if (remainingBits > 0)
bytes[bytes.Length - 2] &= (byte)((1 << remainingBits) - 1);

return new BigInteger(bytes);
}

我想这会起作用

关于Java 的 BigInteger C# 以 Base 32 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38856807/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com