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