c# -可以使用数组初始化器从一个字节数组中创建另一个字节数组吗?

本文关键字:数组 字节数 字节 一个 创建 另一个 可以使 初始化 | 更新日期: 2023-09-27 18:03:44

我想使用数组初始化器来构建一个字节数组的另一个字节数组,以及一些其他字节,形成一个头/尾。基本上,我想这样做:

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

上面的GetBytes()是虚构的,很遗憾。

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

c# -可以使用数组初始化器从一个字节数组中创建另一个字节数组吗?

最接近的是:

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

你可以创建一个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();
}

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

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