2016-08-24 14 views
3

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

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

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

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

+0

это раздражает, потому что я wan't, чтобы закрыть это [как боян] (http://stackoverflow.com/questions/4616371/insert-a- byte-array-in-another-byte-array-at-a-specific-position-with-c-sharp) ... но ваша конкретная формулировка делает ее невосприимчивой к этому .... так что ответьте на свою досадущую формулировку : NO – musefan

ответ

6

Ближайший можно получить бы:

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

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

static T[] ConcatArrays<T>(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 }); 
1

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

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

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

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

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

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

Я не знал, что вы можете переопределить, чтобы вы могли инициализировать коллекцию, черт побери! –

+0

@ johnny5 Я не переопределял его. Я перегрузил его. Большая разница. Добавить «запечатан», поэтому его нельзя переопределить. – Servy

+0

Я имел в виду перегрузку, не имел кофе сегодня утром –