在我们的应用程序中,我们有一个非常大的字节数组,我们必须将这些字节转换为不同的类型。目前,我们为此使用BitConverter.ToXXXX()。我们的重击手是ToInt16ToUInt64

对于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)。

10-08 06:22