C # – Можно ли использовать инициализатор массива для построения одного байтового массива из другого?

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

byte[] DecorateByteArray(byte[] payload) { return new byte[] { 0, 1, 2, payload.GetBytes(), 3, 4, 5}; } 

GetBytes() выше, к сожалению, вымышленное.

Есть ли хороший / элегантный способ сделать это? Я решил это, используя BinaryWriter чтобы записать все в MemoryStream , а затем преобразовать это в байтовый массив с MemoryStream.ToArray() , но он чувствует себя неуклюжим.

Самое близкое, что вы могли бы получить:

 byte[] DecorateByteArray(byte[] payload) => new byte[] { 0, 1, 2 } .Concat(payload) .Concat(new byte[] { 3, 4, 5 }) .ToArray(); 

Это было бы довольно неэффективно. Вам будет лучше делать что-то вроде:

 static T[] ConcatArrays(params T[][] arrays) { int length = arrays.Sum(a => a.Length); T[] ret = new T[length]; int offset = 0; foreach (T[] array in arrays) { Array.Copy(array, 0, ret, offset, array.Length); offset += array.Length; } return ret; } 

(По возможности используйте Buffer.BlockCopy ).

Затем назовите его:

 var array = ConcatArrays(new byte[] { 0, 1, 2 }, payload, new byte[] { 3, 4, 5 }); 

Вы можете создать новую коллекцию, которая является List , но имеет перегрузку Add которая добавляет целый массив байтов:

 public class ByteCollection: List { public void Add(IEnumerable bytes) { AddRange(bytes); } } 

Затем вы можете использовать инициализатор коллекции для этого типа для подачи либо одного байта, либо последовательности байтов, после чего вы можете вернуться в массив, если вам нужен массив:

 byte[] DecorateByteArray(byte[] payload) { return new ByteCollection() { 0, 1, 2, payload, 3, 4, 5 }.ToArray(); } 

Один простой способ – разбить каждый на части, а затем конкатенировать их

 byte[] DecorateByteArray(byte[] payload) { return new byte[] { 0, 1, 2} .Concat(payload.GetBytes()) .Concat(new byte[] { 3, 4, 5}); }