stream.write 是如何工作的?

How does stream.write work?

基本上,为什么这样做有效?

System.IO.Stream stream = new MemoryStream();
int a = 4;
byte[] barray = new byte[a];
stream.Write(barray, 0, Marshal.SizeOf(a));

如果不是:

System.IO.Stream stream = new MemoryStream();
int a = 3;
byte[] barray = new byte[a];
stream.Write(barray, 0, Marshal.SizeOf(a));

这是我得到的错误:

The offset and length were greater than allowed for the matrix, or the number is greater than the number of elements from the index to the end of the source collection.

当使用 Marshel.SizeOf(a) 时,您询问内存中对象的大小。由于 a 是一个 int,因此大小始终为 4。

当你说 byte[] barray = new byte[a]; 你说:

创建一个名为 barray 的数组,类型为 byte,长度为 a。因此,在第一个代码块中,您创建了一个长度为 4 的数组,在第二个代码块中,您创建了一个长度为 3 的数组。两个数组都只包含零。

然后你说:将(空)数组写入流,从位置 0 开始,长度为 4(Marshel.SizeOf(a) 始终为 4,因为 a 是一个整数)。

第一个示例数组的长度为 4,因此有效。第二个例子只包含 3 个字节,因此长度不正确,你会得到一个错误。


如果您希望将 int 作为字节显式保存到流中,您可以调用 BitConverter:

System.IO.Stream stream = new MemoryStream();
int a = 4;
byte[] barray = System.BitConverter.GetBytes(a);
stream.Write(barray, 0, Marshal.SizeOf(a));

现在你说:创建一个名为 barray 的数组,其中填充了整数变量 a.

的二进制表示

然后将 填充的 数组写入流。