2013-01-22 32 views
6

的考虑到这些整数字节数组:创建整数集

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

什么是创建一个从他们byte[]阵列的最佳方式?如果它们的全部值是1,那么得到的阵列将是:

00000000000000000000000000000001 00000000000000000000000000000001 00000000000000000000000000000001 00000001 00000001 
+0

字节数组或位阵列?您可以使用http://msdn.microsoft.com/en-us/library/aa311381%28v=vs.71%29.aspx来获取一个字节数组,然后您将不得不交换字节周围的字节顺序。 – Matthew

+0

你有什么试过,为什么你需要一个字节数组,它是干什么用的?使它们成为属性,用属性装饰它们,然后将装饰过的属性写入流中,然后将其作为一个数组来抓取可能是最好的方法,当然可以作为扩展或接口来重用。 –

+0

@Tony这是一个实时多人游戏,它是从服务器发送给所有更新游戏状态的客户端的消息。我设法从循环中获得正确的数组,但我的方法太慢了。只是想知道最佳做法是什么,因为我对这种事情没有太多经验 –

回答

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

+1,但它不创建“向后”数组,“BitConverter”按正在使用的处理器的字节顺序返回一个字节数组,这恰好是x86处理器上的小端(最低有效字节在前) 。 – Matthew

+0

非常真实我将编辑我如何说明答案 – Robert

+0

@罗伯特感谢伟大工程,我已经添加了我自己的答案基于你http://stackoverflow.com/a/14464592/356635 –

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; 
+0

谢谢,更新的问题!愚蠢的错误:) –

1

扩大对@罗伯特的回答我创建了一个简单的类,使事情变得更整洁,当你做很多concatanations的:

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