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

C# byte operations optimization: how to get dword from byte[] array

是否可以在一次操作中从 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;

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

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

第一次执行时将通过抖动进行优化。如果您自己尝试类似的方法,您不会获得更好的性能。

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

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

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

一旦在 fixed 内部,b 当前是一个 byte*(指向一个字节的指针),但是你想要 4 个字节,所以我们将它转​​换为一个 int*(指向一个字节的指针)一个整数)。请注意,它仍然是相同的值。然后我们取消引用指针以获取实际的整数值。 (*v)