Som*_*ter 15 .net c# casting bitconverter
在我们的应用程序中,我们有一个非常大的字节数组,我们必须将这些字节转换为不同的类型.目前,我们BitConverter.ToXXXX()用于此目的.我们的重击手是,ToInt16和ToUInt64.
因为UInt64,我们的问题是数据流实际上有6个字节的数据来表示一个大整数.由于没有将6字节数据转换为的本机函数UInt64,我们可以:
UInt64 value = BitConverter.ToUInt64() & 0x0000ffffffffffff;
Run Code Online (Sandbox Code Playgroud)
我们的使用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));
}
Run Code Online (Sandbox Code Playgroud)
你需要在构建设置中使你的程序集"不安全",并标记你不安全的方法.这种方法也与小端有关.
您可以使用System.Buffer该类将整个数组复制到另一个不同类型的数组,作为快速的“块复制”操作:
BlockCopy 方法使用内存偏移来访问 src 参数数组中的字节,而不是使用诸如索引或数组上下边界之类的编程结构。
数组类型必须是“原始”类型,它们必须对齐,并且复制操作对字节序敏感。在您的 6 字节整数的情况下,它不能与任何 .NET 的“原始”类型对齐,除非您可以获得每六个填充两个字节的源数组,然后将对齐到Int64. 但是此方法适用于 的数组Int16,这可能会加快您的某些操作。