【问题标题】:How does stream.write work? [closed]stream.write 是如何工作的? [关闭]
【发布时间】:2018-08-15 11:41:15
【问题描述】:

基本上,为什么会这样?

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.

【问题讨论】:

  • Marshal.SizeOf(a) 在这两种情况下都是 4。
  • 不会使用barray.Length 作为您的计数更明智吗?
  • 他在做 Marshal.SizeOf(a),a 是一个 int。
  • @jdweng 肯定有区别,第二个不起作用,也不应该,因为3 < 4
  • 它不起作用,因为您试图从 3 个字节长的数组中提取 4 个字节。没有比这更有趣的了。使用Marshal.SizeOf 很少合适,除非您实际上将数据编组到非托管代码。如果您在手动二进制序列化方案中使用它,请不要。 BinaryFormatterprotobuf 是您正在尝试重新发明的现有轮子。

标签: c# arrays memorystream


【解决方案1】:

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

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

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

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

第一个示例数组的长度为 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 的二进制表示。

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

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 2013-05-05
    • 2010-11-07
    • 2013-05-19
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多