C#字节操作优化:如何从byte []数组中获取dword

时间:2017-05-11 12:53:43

标签: c# .net micro-optimization

是否可以在一次操作中从byte []数组中获取4个字节?

这意味着代替:

var octet_a = bytes[i++];
var octet_b = bytes[i++];
var octet_c = bytes[i++];
var octet_d = bytes[i++];

获得类似

的内容
Int32 b4= Get4Bytes(i);
i=i+4;

2 个答案:

答案 0 :(得分:10)

您可以使用BitConverter。因为它实际上使用不安全的方法将字节数组转换为数字,如果可能的话。

var dword = BitConverter.ToInt32(bytes, i);

一旦第一次执行,它将通过抖动进行优化。如果你自己尝试类似的方法,你就不会有更好的表现。

答案 1 :(得分:2)

如上所述,您可以使用BitConverter,这肯定会比您做得更好,但如果您仍想知道它是如何完成的:

public unsafe int Get4Bytes(byte[] bytes, int index)
{
    fixed (byte* b = &bytes[index])
    {
        var v = (int*)b;
        return *v;
    }
}

首先,我们使用b获得指向索引字节fixed的指针。由于C#是一种托管语言,因此运行时可以随时移动内存。当我们对内存进行不安全的操作时,我们使用fixed告诉运行时不要移动bytes

一旦进入固定状态,b当前是byte*(指向一个字节的指针),但是你需要4个字节,所以我们把它转换为int*(指向int的指针) )。请注意,它仍然是相同的值。然后我们取消引用指针以获取实际的整数值。 (*v