繁体   English   中英

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

[英]C# Convert big decimal numbers to byte array

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

var number = "969837669069837851043825067021609343597253227631794160042862620526559";

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

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

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

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

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

您可以编写自己的“ BigInteger like type”,但我强烈建议您这样做。 这是其中的一件事,您可以很快地做很多非常错误的事情。 而且,您甚至永远也不会达到像BigInteger这样的内置类型的效率。

我确实写了一个TryParse替代品来代替坚持1.0的人,所以我可能会给你一些提示:

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

至于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;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM