3

我想使用数组初始值设定项从另一个字节数组以及形成标题/拖尾的其他一些字节构建一个字节数组。基本上,我想做这样的事情:

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

GetBytes()不幸的是,以上是虚构的。

有什么好的/优雅的方法可以做到这一点吗?我通过使用 aBinaryWriter将所有内容写入 a MemoryStream,然后将其转换为带有 的字节数组来解决这个问题MemoryStream.ToArray(),但感觉有点笨拙。

4

3 回答 3

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 });
于 2016-08-24T15:30:46.263 回答
3

您可以创建一个新集合,它是 a 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();
}
于 2016-08-24T15:34:14.870 回答
1

一种简单的方法是将每个部分分解,然后将它们连接起来

byte[] DecorateByteArray(byte[] payload)
{  
    return new byte[] { 0, 1, 2}
        .Concat(payload.GetBytes())
        .Concat(new byte[] { 3, 4, 5});
}
于 2016-08-24T15:33:20.500 回答