在我们的应用程序中,我们有一个非常大的字节数组,我们必须将这些字节转换为不同的类型。目前,我们为此使用BitConverter.ToXXXX()
。我们的重击手是ToInt16
和ToUInt64
。
对于UInt64
,我们的问题是数据流实际上有6个字节的数据来表示一个大整数。由于没有将6字节数据转换为UInt64
的本机函数,因此我们执行以下操作:
UInt64 value = BitConverter.ToUInt64() & 0x0000ffffffffffff;
我们对
ToInt16
的使用更为简单,无需进行任何操作。我们在这两个操作中做了很多,我想问问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 置中使程序集“不安全”,并标记您将要进行此操作的方法也不安全。您还可以通过这种方式与little endian绑定(bind)。