c# - 使用 BitConverter 在 C# 中进行快速转换,它能更快吗?

标签 c# .net casting bitconverter

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

对于 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/

相关文章:

java - Java中根据对象类型调用子类的方法

c# - Azure Active Directory - 如何以编程方式将应用程序角色分配给组

c# - 获取给定 XML 元素的所有有效属性

.net - 项目引用中未使用的程序集的影响

c# - LINQ 按月分组问题

java - 返回接口(interface)而不是类<Interface>

python - 如何序列化其成员不可直接序列化但其 str() 表示可序列化的对象?

c# - 在 ASP.NET 中使用 OpenID 进行 session 管理和链接用户帐户

c# - Foreach 不会将每个项目从 foreach 添加到 ViewModel

c# - 遵循 MVVM 在 WPF 应用程序中集成上下文相关帮助