6

给定这些整数:

public uint ServerSequenceNumber;
public uint Reserved1;
public uint Reserved2;
public byte Reserved3;
public byte TotalPlayers;

从它们创建byte[]数组的最佳方法是什么?如果它们的所有值都是1结果数组,则为:

00000000000000000000000000000001 00000000000000000000000000000001 00000000000000000000000000000001 00000001 00000001
4

3 回答 3

7

这应该可以满足您的需求。BitConverter 按正在使用的处理器的字节顺序返回一个字节数组。对于 x86 处理器,它是 little-endian。这会将最低有效字节放在首位。

 int value;
 byte[] byte = BitConverter.GetBytes(value);
 Array.Reverse(byte);
 byte[] result = byte;

如果您不知道您将使用该应用程序的处理器,我建议您使用:

int value;
byte[] bytes = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian){
Array.Reverse(bytes);
}
byte[] result = bytes;
于 2013-01-22T16:49:50.097 回答
2

这个怎么样?

byte[] bytes = new byte[14];
int i = 0;
foreach(uint num in new uint[]{SecureSequenceNumber, Reserved1, Reserved2})
{
    bytes[i] = (byte)(num >> 24);
    bytes[i + 1] = (byte)(num >> 16);
    bytes[i + 2] = (byte)(num >> 8);
    bytes[i + 3] = (byte)num;
    i += 4;
}
bytes[12] = Reserved3;
bytes[13] = TotalPlayers;
于 2013-01-22T16:50:47.767 回答
1

扩展@Robert 的答案,我创建了一个简单的类,当您进行大量连接时,它可以让事情变得更整洁:

class ByteJoiner
{
    private int i;
    public byte[] Bytes { get; private set; }

    public ByteJoiner(int totalBytes)
    {
        i = 0;
        Bytes = new byte[totalBytes];
    }

    public void Add(byte input)
    {
        Add(BitConverter.GetBytes(input));
    }
    public void Add(uint input)
    {
        Add(BitConverter.GetBytes(input));
    }
    public void Add(ushort input)
    {
        Add(BitConverter.GetBytes(input));
    }
    public void Add(byte[] input)
    {
        System.Buffer.BlockCopy(input, 0, Bytes, i, input.Length);
        i += input.Length;
    }
}
于 2013-01-22T17:32:46.693 回答