如何通过移位将字节插入数组?

Posted

技术标签:

【中文标题】如何通过移位将字节插入数组?【英文标题】:how to insert bytes into array with shifting? 【发布时间】:2021-11-30 01:35:19 【问题描述】:

我有一个字节数组,例如:

0,1,2,3,4,5,6,7,8,9

我想将较小的数组插入:

我要在原数组第三个索引之后插入的数组:

11,11,11

所以最终的数组应该是这样的:

0,1,2,3,11,11,11,4,5,6,7,8,9

如您所见,我需要保留数组的原始值,将它们向左移动,然后用新数组代替它。 我正在调查 Array.Copy() 但它覆盖了原始值,而不是移动它们

【问题讨论】:

你需要一个新的数组来容纳组合的数组,所以分配它并使用三次Array.Copy() 来复制 array1 的第一部分,然后是 array2,然后是 array1 的第二部分。 数组是最好的数据结构吗?即使它在幕后使用数组,当然只是能够在List<byte> 上写InsertRange(3, otherData) 会让您专注于完成工作,而不是大惊小怪地复制数组值等. 你并不真正想要一个数组,而是一个 List @Damien_The_Unbeliever 我需要将带有文件流的结果数据写入文件,这就是它的字节数组的原因 如果您使用.net 5.0 或更高版本,您可以将List<byte> 写入FileStream,而无需使用fileStream.Write(CollectionsMarshal.AsSpan(listOfBytes)); 转换为数组(这不会复制数据所以它非常有效,但是当fileStream.Write() 正在做它的事情时,你不能在另一个线程中更改listOfBytes。) 【参考方案1】:

您可以尝试使用 Linq查询 array 并将结果分配给它:

 using System.Linq;

 ...

 int[] array = new int[] 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
 int[] insert = new int[] 11, 11, 11;

 array = array
   .Take(4)
   .Concat(insert)
   .Concat(array.Skip(4)) 
   .ToArray();  

如果您正在寻找低级 Array 方法:

int[] array = new int[]  0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ;
int[] insert = new int[]  11, 11, 11 ;

int at = 4;

Array.Resize<int>(ref array, array.Length + insert.Length);

Array.Copy(array, at, array, at + insert.Length, array.Length - at - insert.Length);
Array.Copy(insert, 0, array, at, insert.Length);

【讨论】:

不错的最小解决方案!【参考方案2】:

您可以将数组转换为列表。列表类似于数组,但您可以轻松添加、插入或删除值。请参阅此代码:

int[] array = new int[] 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
int[] insert = new int[] 11, 11, 11;

List<int> list = new List<int>(array);
list.InsertRange(4, insert);
        
array = list.ToArray(); // convert the list back to an array

在线演示:https://dotnetfiddle.net/GeEAeU

【讨论】:

以上是关于如何通过移位将字节插入数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字节数组插入 Informix blob

图解插入排序

如何合并具有特定移位(偏移)的两个位图?

如何在Java 8中循环通过字节数组?

通过 Web 服务将文件作为字节数组发送时会产生多少额外开销?

如何将字节数组写入文件? [复制]