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