c# – 在流中设置偏移量

前端之家收集整理的这篇文章主要介绍了c# – 在流中设置偏移量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
它在这里说msdn.microsoft.com/en-us/library/system.io.stream.read.aspx,Stream.Read和Stream.Write方法自动推进流中的位置/偏移量,为什么这里的示例 http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspxhttp://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx手动改变偏移量?

如果您知道流的大小,是否只在循环中设置偏移量,如果您不知道大小并使用缓冲区,则将其设置为0?

  1. // Now read s into a byte buffer.
  2. byte[] bytes = new byte[s.Length];
  3. int numBytesToRead = (int) s.Length;
  4. int numBytesRead = 0;
  5. while (numBytesToRead > 0)
  6. {
  7. // Read may return anything from 0 to 10.
  8. int n = s.Read(bytes,numBytesRead,10);
  9. // The end of the file is reached.
  10. if (n == 0)
  11. {
  12. break;
  13. }
  14. numBytesRead += n;
  15. numBytesToRead -= n;
  16. }

  1. using (GZipStream stream = new GZipStream(new MemoryStream(gzip),CompressionMode.Decompress))
  2. {
  3. const int size = 4096;
  4. byte[] buffer = new byte[size];
  5. using (MemoryStream memory = new MemoryStream())
  6. {
  7. int count = 0;
  8. do
  9. {
  10. count = stream.Read(buffer,size);
  11. if (count > 0)
  12. {
  13. memory.Write(buffer,count);
  14. }
  15. }
  16. while (count > 0);
  17. return memory.ToArray();
  18. }
  19. }

解决方法

编辑(编辑问题):

在您粘贴到问题中的所有代码段中,我都看不到任何流偏移设置.

我认为你错误地计算了读取的字节数和接收的字节数.这个协议可能看起来很有趣(为什么你会收到比请求更少的字节?)但是当你考虑到你可能正在从高延迟的数据包导向源(想想:网络套接字)中读取它时,这是有道理的.

您可能在一次突发中接收6个字符(来自TCP数据包),并且只在下次读取时接收剩余的4个字符(当下一个数据包到达时).

编辑从评论回复您的linked example

  1. using (GZipStream stream = new GZipStream(new MemoryStream(gzip),CompressionMode.Decompress))
  2. {
  3. // ... snip
  4.  
  5. count = stream.Read(buffer,count);
  6. }

似乎编码器使用关于底层流实现的先验知识,该流将始终返回0或所请求的大小.对我来说,这似乎是一个冒险的赌注.但是如果GZipStream的文档说明了这一点,那就没问题了.但是,由于MSDN示例使用通用的Stream变量,因此检查读取的确切字节数更为正确.

第一个链接示例以Write和Read方式使用MemoryStream.位置在两者之间重置,因此首先写入的数据将被读取:

  1. Stream s = new MemoryStream();
  2. for (int i = 0; i < 100; i++)
  3. {
  4. s.WriteByte((byte)i);
  5. }
  6. s.Position = 0;

链接的第二个示例不设置流位置.如果确实如此,你通常会看到Seek的电话.您可能会使用流位置将偏移混淆到数据缓冲区中?

猜你在找的C#相关文章