如何在C#中将huuuuuge字符串加载到BigInteger中,而不会丢失ASCII编码

时间:2018-01-24 19:52:48

标签: c# biginteger

我正在使用BigInteger.Parse(一些字符串),但它需要永远,我甚至不确定它是否完成。

但是,我可以将巨大的字符串转换为字节数组并在很短的时间内将字节数组转换为BigInteger构造函数,但由于BigInteger和字节数组的字节序问题,它会导致存储在字符串中的原始数字。 / p>

有没有办法将字符串转换为字节数组并将字节数组放入BigInteger对象,同时保留字符串中ASCII存储的原始数字?

String s = "12345";  // Some huge string, millions of digits.

BigInteger bi = new BigInteger(Encoding.ASCII.GetBytes(s);  // very fast but the 12345 is lost 

// OR...
BigInteger bi = BigInteger.Parse(s);  // Takes forever therefore unuseable.

1 个答案:

答案 0 :(得分:5)

byte[]的{​​{1}}表示与ASCII字符几乎没有关系。就像BigInteger的字节表示与它的ASCII表示几乎没有关系。

要解析数字,每个字符必须转换为数字值,并添加到先前解析的值乘以10.这可能是它花了这么长时间的原因,你编写的任何版本都可能不会表现更好。它必须做类似的事情:

int

修改

虽然不可能通过转换为字节数组来执行转换,但是库实现比必须慢(至少对于不需要国际化的简单场景)。使用Rudy Velthuis在评论中提出的技巧而不考虑十六进制格式或国际化,我能够生成一个版本,对于303104个字符运行速度快〜5倍(从18.2s到3.75s。对于100万个数字,快速方法需要47s,很长,但这是一个巨大的数字):

    var nr=0;
    foreach(var c in "123") nr=nr*10+(c-'0');