将值对转换为byte []

时间:2016-11-23 12:14:27

标签: c#

我需要一种将一对整数转换为字节数组的快速方法。如果它是单个值,我可以使用以下内容:

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做同样的事情,但我想比较两者的表现)

1 个答案:

答案 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;
}