Ascii Bytes数组到Int32或Double

时间:2010-03-26 12:21:13

标签: c# .net ascii byte int32

我正在重新编写图书馆,其任务是完全免费分配。目标是在应用程序的启动阶段完成后拥有0个集合。

以前,有很多这样的电话:

Int32 foo = Int32.Parse(ASCIIEncoding.ASCII.GetString(bytes, start, length));

我相信分配一个字符串。我找不到一个自动执行相同操作的C#库函数。我查看了BitConverter类,但看起来只有当你的Int32使用代表它的实际字节进行编码时才会这样。这里,我有一个字节数组,表示代表Int32的Ascii字符。

这就是我做的事情

public static Int32 AsciiBytesToInt32(byte[] bytes, int start, int length)
{
     Int32 Temp = 0;
     Int32 Result = 0;
     Int32 j = 1;

     for (int i = start + length - 1; i >= start; i--)
     {
          Temp = ((Int32)bytes[i]) - 48;

          if (Temp < 0 || Temp > 9)
          {
               throw new Exception("Bytes In AsciiBytesToInt32 Are Not An Int32");
          }

          Result += Temp * j;
          j *= 10;
     }

     return Result;
}

有没有人知道C#库函数已经以更优化的方式完成了这项工作?或者改进以使上述运行更快(可能在白天被称为数百万次)。谢谢!

1 个答案:

答案 0 :(得分:5)

每天数百万次不应该成为问题 - 我希望每秒能够运行数十万次。我个人会重写上面的内容,只在循环中声明“temp”(并删除Pascal案例的局部变量名称 - urgh),但它应该没问题。

代码可以更直接地理解为:

int digit = bytes[i] - '0';

与您的

相同
Temp = ((Int32)bytes[i]) - 48;

行,但以更简单的方式(IMO)。它们的行为应该完全相同。

总的来说,尝试编写C#而不进行任何分配是相当苛刻的,并且与语言和框架的设计方式相抗衡。你认为这实际上是一个合理的要求吗?不可否认,我听说有些游戏是用托管代码编写的......但它确实有点奇怪。

当然,如果字节不合适,你将分配一个例外......

编辑:请注意,您的代码不允许使用负数。那可以吗?