c # как добавить байт в байтовый массив - PullRequest
16 голосов
/ 08 апреля 2011

Как добавить байт в начало существующего байтового массива? Моя цель - сделать массив длиной от 3 до 4 байтов. Вот почему мне нужно добавить отступ 00 в начале.

Ответы [ 6 ]

43 голосов
/ 08 апреля 2011

Вы не можете этого сделать. Изменить размер массива невозможно. Вы должны создать новый массив и скопировать в него данные:

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;
}
15 голосов
/ 08 апреля 2011

Как отмечают многие здесь, массивы в 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();
6 голосов
/ 08 апреля 2011

Размеры массивов не могут быть изменены, поэтому вам нужно выделить новый массив большего размера, записать новый байт в его начало и использовать Buffer.BlockCopy для передачи содержимого старого массива.

5 голосов
/ 08 апреля 2011

Чтобы предотвратить повторное копирование массива каждый раз, когда это неэффективно

Как насчет использования стека

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

3 голосов
/ 08 апреля 2011

Хотя внутри он создает новый массив и копирует в него значения, вы можете использовать Array.Resize<byte>() для более удобочитаемого кода. Также вы можете рассмотреть возможность проверки класса MemoryStream в зависимости от того, чего вы пытаетесь достичь.

0 голосов
/ 16 мая 2018

Просто, просто используйте код ниже, как я:

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