Копировать байты из одного массива в другой - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь скопировать определенное количество байтов из одного байтового массива в другой байтовый массив, я искал многочисленные ответы на похожие вопросы, но, похоже, не могу найти решение.

Базовый пример кода,

byte[] data = new byte[1024];
int bytes = stream.Read(data, 0, data.Length);

byte[] store;

если я сделаю

Console.WriteLine(bytes);

вернет количество байтов, прочитанных из потока, которое равно

24

это единственные байты, которые мне нужно передать в массив 'store' .. но, конечно, если я укажу

byte[] store = data;

тогда потребуется 1024 байта, 1000 из которых пусты.

так что я действительно хочу что-то вроде

byte[] store = (data, 0, bytes);

, который обеспечит хранилище 24 байта из массива данных.

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Вы можете использовать Array.Copy:

byte[] newArray = new byte[length];
Array.Copy(oldArray, startIndex, newArray, 0, length);

или Buffer.BlockCopy:

byte[] newArray = new byte[length];
Buffer.BlockCopy(oldArray, startIndex, newArray, 0, length);

Или LINQ:

var newArray = oldArray
.Skip(startIndex) // skip the first n elements
.Take(length) // take n elements
.ToArray(); // produce array

Попробуйте ихонлайн

В качестве альтернативы, если вы используете C # 7.2 или новее (и если на пакет System.Memory NuGet ссылается, если вы используете .NET Framework), вы можете использовать Span<T>:

var newArray = new Span<byte>(oldArray, startIndex, length).ToArray();

Или, если хотите, вы можете просто передать Span<T> без преобразования его в массив.

0 голосов
/ 03 июня 2019

Вы ищете что-то подобное?

byte[] Slice(byte[] source, int start, int len)
{
    byte[] res = new byte[len];

    for (int i = 0; i < len; i++)
    {
        res[i] = source[i + start];
    }

    return res;
}
...