2016-08-24 40 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-into-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

一个简单的方法是打出来的各成零件,然后CONCAT他们

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

我的意思是超负荷,今天早上没有喝咖啡 –

相关问题