2014-03-13 9 views
0

編輯:解決方案是在帖子底部C#MemoryStream.Read()總是讀取相同的部分

我想我的運氣與閱讀二進制文件。由於我不想依賴byte[] AllBytes = File.ReadAllBytes(myPath),因爲二進制文件可能相當大,我想在一個循環中讀取相同大小的小部分(這很適合用於讀取文件格式),使用我將調用的內容一個「緩衝區」。

public void ReadStream(MemoryStream ContentStream) 
    { 
     byte[] buffer = new byte[sizePerHour]; 
     for (int hours = 0; hours < NumberHours; hours++) 
     {     
      int t = ContentStream.Read(buffer, 0, sizePerHour); 
      SecondsToAdd = BitConverter.ToUInt32(buffer, 0); 

      // further processing of my byte[] buffer 
     } 
    } 

我的流包含我想要的所有字節,這是件好事。當我進入循環時,有幾件事停止工作。 我的int t0雖然我會假定ContentStream.Read()將處理來自流內的信息到我的bytearray,但事實並非如此。

我試過buffer = ContentStream.GetBuffer(),但是這會導致我的緩衝區包含我的所有流,這是我想通過讀取緩衝區來避免的行爲。

在讀取之前將流重置爲位置0沒有幫助,因爲我的Stream.Read()指定了偏移量,這意味着我迷路了。

任何人都可以指向我閱讀流的一小部分字節[]?也許有一些代碼?

在此先感謝

編輯:

指向我的方向是正確的答案,那.Read()返回0如果到達流的末尾。我將我的代碼修改爲以下內容:

public void ReadStream(MemoryStream ContentStream) 
    { 
     byte[] buffer = new byte[sizePerHour]; 

     ContentStream.Seek(0, SeekOrigin.Begin); //Added this line 
     for (int hours = 0; hours < NumberHours; hours++) 
     {     
      int t = ContentStream.Read(buffer, 0, sizePerHour); 
      SecondsToAdd = BitConverter.ToUInt32(buffer, 0); 

      // further processing of my byte[] buffer 
     } 
    } 

而且一切都像魅力一樣。我最初重置流到它的原點,每次迭代hour並給出一個偏移量。在我的外觀之外移動「設置爲開始部分」並將偏移量保留爲0就是個訣竅。

+0

'sizePerHour'(在調試器中)的值是什麼? –

+0

在第一次迭代中,我的緩衝區[]仍然填充有'0',在第二次迭代中,我得到一個'ArgumentException',說明數組的偏移量和/或長度超出了有效範圍。爲什麼我的緩衝區[]在第一次迭代後填充了'0'? sizePerHour的值是446404,我的流的大小是74995872. – lhiapgpeonk

回答

2

如果到達流的末尾,則讀返回零。你確定,你的記憶流有你期望的內容嗎?我試過以下,它按預期工作:

// Create the source of the memory stream. 
UInt32[] source = {42, 4711}; 
List<byte> sourceBuffer = new List<byte>(); 
Array.ForEach(source, v => sourceBuffer.AddRange(BitConverter.GetBytes(v))); 

// Read the stream. 
using (MemoryStream contentStream = new MemoryStream(sourceBuffer.ToArray())) 
{ 
    byte[] buffer = new byte[sizeof (UInt32)]; 
    int t; 
    do 
    { 
     t = contentStream.Read(buffer, 0, buffer.Length); 
     if (t > 0) 
     { 
      UInt32 value = BitConverter.ToUInt32(buffer, 0); 
     } 
    } while (t > 0); 
} 
+0

這指出我正確的方法:-)謝謝! – lhiapgpeonk