从整数集创建字节数组

时间:2013-01-22 16:45:54

标签: c# bytearray byte concatenation bit-manipulation

考虑到这些整数:

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

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

00000000000000000000000000000001 00000000000000000000000000000001 00000000000000000000000000000001 00000001 00000001

3 个答案:

答案 0 :(得分:7)

这应该做你想要的。 BitConverter按正在使用的处理器的字节顺序返回一个字节数组。对于x86处理器来说,它是小端的。这将最低有效字节放在首位。

 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;

答案 1 :(得分: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;

答案 2 :(得分: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;
    }
}