搜索之后,我没有找到一个易于理解的解释,说明为什么在使用BlockCopy方法时添加了额外的4个字节(如图所示here,here,{{ 3}},here)
here说:
顾名思义,BlockCopy方法将字节块复制为 一个整体,而不是一次复制一个字节。因此,如果src和 dst引用相同的数组,范围从srcOffset + count -1 重叠范围从dstOffset + count - 1,其值 重叠字节在复制到之前不会被覆盖 目的地。在以下示例中,字节0-16的值为 名为arr的数组被复制到字节12-28。尽管有重叠 范围,源字节的值被成功复制。
然而,我并没有真正理解这一点,并希望有人能够以不同的方式解释它(或发布一个解释这个的资源的链接),以及为什么需要添加这些额外的4个字节。< / p>
为清楚起见,这里是我所指的代码:
作为压缩方法的一部分:
byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
作为解压缩方法的一部分:
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
答案 0 :(得分:5)
这不是关于BlockCopy
本身 - 它是关于长度前缀的一些数据,这就是全部。您已经发现了一些被广泛复制的代码而没有特别好的文档。
在阅读“消息”以了解该消息在您开始阅读之前有多长时间时,这通常很有用 - 这意味着您不需要分隔符,或者希望流的结尾意味着数据的结束。此代码仅压缩数据,然后在压缩数据之前写入压缩长度。