使用BitConverter在C#中快速转换,它可以更快吗?

Som*_*ter 15 .net c# casting bitconverter

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

因为UInt64,我们的问题是数据流实际上有6个字节的数据来表示一个大整数.由于没有将6字节数据转换为的本机函数UInt64,我们可以:

UInt64 value = BitConverter.ToUInt64() & 0x0000ffffffffffff;
Run Code Online (Sandbox Code Playgroud)

我们的使用ToInt16更简单,不必做任何操作.

我们在这两个操作中做了很多,我想问SO社区是否有更快的方法来进行这些转换.现在,这两个功能消耗了我们整个CPU周期的大约20%.

Jim*_*mmy 7

你有没有想过直接使用内存指针.我无法保证其性能,但它是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));
        }
Run Code Online (Sandbox Code Playgroud)

你需要在构建设置中使你的程序集"不安全",并标记你不安全的方法.这种方法也与小端有关.

  • 小心这个.如果要在数组末尾读取其中一个6字节数字,您将获得异常.也就是说,如果在上面的示例中,数组只有12个字节长,那么在读取第二个值时会出现异常. (2认同)

All*_*nek 5

您可以使用System.Buffer该类将整个数组复制到另一个不同类型的数组,作为快速的“块复制”操作:

BlockCopy 方法使用内存偏移来访问 src 参数数组中的字节,而不是使用诸如索引或数组上下边界之类的编程结构。

数组类型必须是“原始”类型,它们必须对齐,并且复制操作对字节序敏感。在您的 6 字节整数的情况下,它不能与任何 .NET 的“原始”类型对齐,除非您可以获得每六个填充两个字节的源数组,然后将对齐到Int64. 但是此方法适用于 的数组Int16,这可能会加快您的某些操作。