web-dev-qa-db-ja.com

C#バイト配列にバイトを追加する方法

既存のバイト配列の先頭にバイトを追加する方法は?私の目標は、長さ3バイトから4バイトの配列を作成することです。そのため、先頭に00パディングを追加する必要があります。

16
hs2d

それはできません。配列のサイズを変更することはできません。新しい配列を作成し、そこにデータをコピーする必要があります。

bArray = addByteToArray(bArray,  newByte);

コード:

public byte[] addByteToArray(byte[] bArray, byte newByte)
{
    byte[] newArray = new byte[bArray.Length + 1];
    bArray.CopyTo(newArray, 1);
    newArray[0] = newByte;
    return newArray;
}
44
Guffa

ここで多くの人が指摘しているように、C#の配列は、他のほとんどの一般的な言語と同様に、静的にサイズ変更されます。 PHPの配列のようなものを探している場合、動的サイズの配列(および型付けされた配列)を持つ人気のある言語であるため、ArrayListを使用する必要があります。

var mahByteArray = new ArrayList<byte>();

他の場所からバイト配列がある場合は、AddRange関数を使用できます。

mahByteArray.AddRange(mahOldByteArray);

次に、Add()とInsert()を使用して要素を追加できます。

mahByteArray.Add(0x00); // Adds 0x00 to the end.
mahByteArray.Insert(0, 0xCA) // Adds 0xCA to the beginning.

配列に戻す必要がありますか? .ToArray()でカバーします!

mahOldByteArray = mahByteArray.ToArray();
15
Tyler Menezes

配列はサイズ変更できないため、より大きな新しい配列を割り当て、その先頭に新しいバイトを書き込み、Buffer.BlockCopyを使用して古い配列の内容を転送する必要があります。

6
Jason Williams

毎回配列を再コピーしないようにするには、効率的ではありません

Stackの使用はどうですか

csharp> var i = new Stack<byte>();
csharp> i.Push(1);
csharp> i.Push(2); 
csharp> i.Push(3); 
csharp> i; { 3, 2, 1 }

csharp> foreach(var x in i) {
  >       Console.WriteLine(x);
  >     }

3 2 1

5
James Kyburz

内部的には新しい配列を作成し、そこに値をコピーしますが、Array.Resize<byte>()を使用してコードを読みやすくすることができます。また、達成しようとしているものに応じて、MemoryStreamクラスのチェックを検討することもできます。

3
C.Evenhuis

シンプルで、次のコードを使用してください。

        public void AppendSpecifiedBytes(ref byte[] dst, byte[] src)
    {
        // Get the starting length of dst
        int i = dst.Length;
        // Resize dst so it can hold the bytes in src
        Array.Resize(ref dst, dst.Length + src.Length);
        // For each element in src
        for (int j = 0; j < src.Length; j++)
        {
            // Add the element to dst
            dst[i] = src[j];
            // Increment dst index
            i++;
        }
    }

    // Appends src byte to the dst array
    public void AppendSpecifiedByte(ref byte[] dst, byte src)
    {
        // Resize dst so that it can hold src
        Array.Resize(ref dst, dst.Length + 1);
        // Add src to dst
        dst[dst.Length - 1] = src;
    }
0