我需要一种将一对整数转换为字节数组的快速方法。如果它是单个值,我可以使用以下内容:
private static unsafe byte[] ToBytes(int value)
{
var bytes = new byte[4];
fixed (byte* pointer = bytes)
{
*(int*)pointer = value;
}
return bytes;
}
然而,我无法弄清楚你是如何为一对整数做同样的事情。以下我尝试 无效 ,但应该有助于展示我的目标
private static unsafe byte[] ToBytes(int value1, int value2)
{
var bytes = new byte[8];
fixed (byte* pointer = bytes)
{
*(int*)pointer = value1;
*(int*)pointer + 4 = value2;
}
return bytes;
}
(我知道我可以使用BitConverter做同样的事情,但我想比较两者的表现)
答案 0 :(得分:3)
这是否会比我不知道的替代方案更好,但正确的语法是这样的:
*((int)pointer + 1) = value2;
此:
*(int)pointer + 4 = value2;
给出错误,因为:*(int)pointer
是一个变量引用,因此您的代码看起来像这样:
i + 4 = value2;
这不是C#中的合法语法。
相反,在将其添加到地址之前将其添加到地址中,然后将其解引为变量引用(lvalue如果您想谷歌搜索这些内容):
*((int)pointer + 1)
+4
也是不正确的,因为指针是“指向int的指针”,而不是“指向字节的指针”,这意味着+X
在字节方面确实是+X * sizeof(int)
等级寻址。
您的最终方法应如下所示:
private static unsafe byte[] ToBytes(int value1, int value2)
{
var bytes = new byte[8];
fixed (byte* pointer = bytes)
{
*(int*)pointer = value1;
*((int*)pointer + 1) = value2;
}
return bytes;
}