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}); } 
Interesting Posts