【问题标题】:MemoryStream: why convert to byte after readByteMemoryStream:为什么在 readByte 之后转换为字节
【发布时间】:2011-07-29 04:57:26
【问题描述】:

this example from MS 中,您会注意到,在我们从内存流中读取一个字节后,它会进入一个 int,然后必须将其转换为字节。让我感到奇怪的是,像 .ReadByte() 这样的函数一开始就没有返回一个字节。 MS这样做是有原因的吗?

// Read the remaining bytes, byte by byte.
while(count < memStream.Length)
{
    byteArray[count++] =
        Convert.ToByte(memStream.ReadByte());
}

我想到了。也许这归结为使用情况。也许ReadByte() 经常用于检索短长度,随后在通过长度变化检索时消耗这些长度

int length=ms.ReadByte();
ms.Read(buf,0,lenth);

即您可以使用没有演员表的长度。这是一个足够好的理由吗?

【问题讨论】:

  • 如果你想要一个字节数组,你应该检查ToArray()

标签: c# .net memorystream


【解决方案1】:

这不是内存流特有的,而是因为基类“Stream”的设计,原因是

返回值:

无符号字节转换为 Int32,如果在流的末尾则为 -1。

-1 不能用无符号字节表示

【讨论】:

  • 并且只有在基于 ReadTimeout 的超时时才返回 -1?
  • 不,-1 表示流结束,例如:您已在文件流上达到 EOF
  • 所以基本上一个值用于表示两种情况,即读取流或达到 EOS。其他实现方式是返回字节,但在EOF抛出异常的情况下,但这会有自己的问题
  • 我注意到 AsyncBeginRead... 但对于 ReadByte,超时是作为事件还是异常发生?
  • 我猜超时会发生异常。
【解决方案2】:

当您使用ReadByte 时,如果读取成功,则流中的当前位置提前一个字节。但如果已到达流的末尾,则其设计为返回 -1。

现在这将不是 Byte 的有效值(其无符号)

ms.Read(buf,0,lenth); 这里 lenth 是要从流中读取的字节数,而您从 ReadByte 获得的是第一个字节,它不能以这种方式使用,类似于

byte[] buff = new byte[ms.Length];
ms.Read(buff , 0, buff .Length);

【讨论】:

    【解决方案3】:

    我确实相信他们正在以一种非常好的方式将其从 int 转换为 byte,因为 ReadByte() 返回一个 int 而他们的 byteArrayint[] 类型。

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      相关资源
      最近更新 更多