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プロセッサの場合、これはリトルエンディアンです。これにより、最下位バイトが最初に配置されます。

 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 に答える