在读取流的时候常常需要进行组合数组的操作
比较有效率的可以使用Buffer类的BlockCopy来拼合两个数组
方法体【详细可以参考MSDN】
public static void BlockCopy (
Array src,
int srcOffset,
Array dst,
int dstOffset,
int count
)
注意:这里只能使用值数组,如果使用对象数组会报ArgumentException
注意:srcOffset和dstOffset不是数组索引,是数组偏移量
比如5,不代表数组的第6个元素,而是代表偏移5个字节位置
参照MSDN上的例子
开发人员应谨记 BlockCopy 方法使用偏移量访问 src 参数,而不是使用索引或数组上下限等编程构造。例如,如果使用应用程序的编程语言声明一个上限为零,下限为 -50 的 Int32 数组,然后将该数组和偏移量 5 传递给 BlockCopy 方法,则该方法将访问的第一个数组元素是该数组的第二个元素(位于索引 -49 处)。此外,首先访问数组元素 -49 的哪个字节取决于执行应用程序的计算机的 Edian 设置。
因为Int32数组每个元素占4个字节,这里数组便宜是5也就是从第二个元素开始了
下面举一个例子
static
void
Main(
string
[] args)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
byte[] b1 = ...{ 12,24,1};
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
byte[] b2 = ...{1,2,3,4,12 };
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
Display(b1, "b1");
Display(b2, "b2");
try
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Buffer.BlockCopy(b1, 0, b2, 0, Buffer.ByteLength(b1));
}
catch (ArgumentException)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Console.WriteLine("error!");
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
Display(b2, "new b2");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
b2 = ComBineArray<byte>(b2, b1);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
Display(b2, "new2 b2");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
byte[] b3 = ...{ 55, 66, 77 };
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
b2 = ComBineArray<byte>(b2, b3);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
Display(b2, "new3 b2");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
Console.ReadLine();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
private
static
void
Display(Array arr,
string
name)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
Console.Write("{0,5}:", name);
for (int loopX = 0; loopX <arr.Length; loopX++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Console.Write(arr.GetValue(loopX)+" ");
}
Console.WriteLine();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
private
static
T[] ComBineArray
<
T
>
(T[] a1, T[] a2)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
T[] result = new T[a1.Length + a2.Length];
int a1Len = Buffer.ByteLength(a1);
int a2Len = Buffer.ByteLength(a2);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
Buffer.BlockCopy(a1, 0, result, 0, a1Len);
Buffer.BlockCopy(a2, 0, result, a1Len, a2Len);
return result;
}
运行一下看看各个阶段的输出结果应该就清楚了