Mic*_*lli 1 .net c# byte ascii int32
我正在重写一个图书馆,其任务是完全免费分配.目标是在应用程序的启动阶段完成后拥有0个集合.
以前,有很多这样的电话:
Int32 foo = Int32.Parse(ASCIIEncoding.ASCII.GetString(bytes, start, length));
Run Code Online (Sandbox Code Playgroud)
我认为这是分配一个字符串.我找不到一个自动执行相同操作的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;
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道C#库函数已经以更优化的方式做到了这一点?或者改进以使上述运行更快(可能在白天被称为数百万次).谢谢!
每天数百万次不应该成为问题 - 我希望每秒能够运行数十万次.就个人而言,我会重写上面的内容,只在循环中声明"temp"(并删除Pascal-cases局部变量名称 - urgh),但它应该没问题.
代码将更容易理解为:
int digit = bytes[i] - '0';
Run Code Online (Sandbox Code Playgroud)
这和你的一样
Temp = ((Int32)bytes[i]) - 48;
Run Code Online (Sandbox Code Playgroud)
线,但以更简单的方式(IMO).它们的行为应该完全相同.
总的来说,尝试编写C#而不进行任何分配是相当苛刻的,并且与语言和框架的设计方式相抗衡.你认为这实际上是一个合理的要求吗?不可否认,我听说有些游戏是用托管代码编写的......但它确实有点奇怪.
当然,如果字节不合适,你将分配一个例外...
编辑:请注意,您的代码不允许使用负数.这样可以吗?
| 归档时间: |
|
| 查看次数: |
2677 次 |
| 最近记录: |