在我们的应用程序中,我们有一个非常大的字节数组,我们必须将这些字节转换成不同的类型。目前,我们为此目的使用 BitConverter.ToXXXX()
。我们的重量级选手是 ToInt16
和 ToUInt64
。
对于 UInt64
,我们的问题是数据流实际上有 6 个字节的数据来表示一个大整数。由于没有将 6 字节数据转换为 UInt64
的 native 函数,我们这样做:
UInt64 value = BitConverter.ToUInt64() & 0x0000ffffffffffff;
我们使用 ToInt16
更简单,不需要做任何位操作。
我们做了很多这 2 个操作,所以我想问 SO 社区是否有更快的方法来进行这些转换。目前,这两个函数消耗了我们整个 CPU 周期的大约 20%。
最佳答案
有没有想过直接使用内存指针。我不能保证它的性能,但它是 C++\C 中的常见技巧...
byte[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 ,9,10,11,12,13,14,15,16};
fixed (byte* a2rr = &arr[0])
{
UInt64* uint64ptr = (UInt64*) a2rr;
Console.WriteLine("The value is {0:X2}", (*uint64ptr & 0x0000FFFFFFFFFFFF));
uint64ptr = (UInt64*) ((byte*) uint64ptr+6);
Console.WriteLine("The value is {0:X2}", (*uint64ptr & 0x0000FFFFFFFFFFFF));
}
您需要在build设置中使您的程序集“不安全”,并标记您执行此操作的方法也是不安全的。您还使用这种方法与小字节序相关联。
关于c# - 使用 BitConverter 在 C# 中进行快速转换,它能更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4923846/