編輯:解決方案是在帖子底部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 t
是0
雖然我會假定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就是個訣竅。
'sizePerHour'(在調試器中)的值是什麼? –
在第一次迭代中,我的緩衝區[]仍然填充有'0',在第二次迭代中,我得到一個'ArgumentException',說明數組的偏移量和/或長度超出了有效範圍。爲什麼我的緩衝區[]在第一次迭代後填充了'0'? sizePerHour的值是446404,我的流的大小是74995872. – lhiapgpeonk