C# 将大十进制数转换为字节数组



如何将一个大的十进制整数转换为字节数组。

var number = "969837669069837851043825067021609343597253227631794160042862620526559";

请注意,我无法使用BigInteger因为我使用的是 .NET 3.5 下的 Unity。

我个人会使用BigInteger. 您可以在播放器设置下更改 Unity 等效于 .NET 4.6 的脚本,这将使您能够访问以前无法访问的一大堆框架。 根据文档.NET 4.6应该包含BigInteger,从而解决您的问题。

要更改脚本等效项,请转到Build Settings=>Player Settings=>Other Settings=>Configuration。 在该设置列表中,您应该能够设置脚本运行时等效项。

完成此操作后,您所要做的就是转换数字:

var number = "969837669069837851043825067021609343597253227631794160042862620526559";
byte[] numberBytes = BigInteger.Parse(number).ToByteArray();

你可以写你自己的"BigInteger like类型",但我强烈建议不要这样做。这是其中之一,你可以很快做很多错误的事情。而且你甚至永远不会接近像BigInteger这样的内置类型的效率。

但是,我确实为卡在 1.0 上的人编写了一个 TryParse 替代品,所以我可能会给你一些提示:

  • 使用无符号整数列表。使用可用的最大整数作为基本类型,这样索引将保持理智的小。还有一个列表,因为您也不想处理整数的增长/收缩
  • 在对任何两个元素进行数学运算时更改为检查上下文。.NET Framework 可以完全检测溢出和下溢错误,但默认情况下该检测处于关闭状态。如果您遇到溢出或下溢错误,这意味着您应该相应地增加/减少下一个数字
  • 大多数算术至少需要一个临时变量。对于加法和减法,您需要存储溢出/下溢情况。对于乘法,您需要将ListA的每个数组元素与ListB的每个数组元素相乘。您只需将每个值 ListA 与 ListB 的一个元素相乘即可。把它放到一些临时变量中。然后将其添加到运行总和中。
  • 这篇关于平等/身份检查的文章可能会帮助你正确地完成这一部分:http://www.codeproject.com/Articles/18714/Comparing-Values-for-Equality-in-NET-Identity-and 你想要值类型语义。
  • 理想情况下,您希望使此类型不可变。大多数集成类型和字符串都是(包括 BigInteger),这样在多任务/线程方案中更容易使用它们。
  • 您可能需要执行解析和 toString()。如果是这样,区域性适当的格式可能会很快成为一个问题。大多数数值类型都有 Parse() 和 toString() 函数,它接受 CultureNumberFormat 作为参数。默认重载只是检索线程区域性/其他一些默认值,并将其交给他们的兄弟。

至于TryParse,这是我为这种情况写的:

//Parse throws ArgumentNull, Format and Overflow Exceptions.
//And they only have Exception as base class in common, but identical handling code (output = 0 and return false).
bool TryParse(string input, out int output){
try{
output = int.Parse(input);
}
catch (Exception ex){
if(ex is ArgumentNullException ||
ex is FormatException ||
ex is OverflowException){
//these are the exceptions I am looking for. I will do my thing.
output = 0;
return false;
}
else{
//Not the exceptions I expect. Best to just let them go on their way.
throw;
}
}
//I am pretty sure the Exception replaces the return value in exception case. 
//So this one will only be returned without any Exceptions, expected or unexpected
return true;
}

最新更新