2012-04-16 43 views
1

我試圖通過讀取部分到一個字節數組來分割一個內存流成塊,但我認爲我有一些根本錯誤的東西。我可以讀取第一個塊,但是當我嘗試讀取其餘的內存流時,即使有更多的字節要讀取,我也會得到索引超出界限。看起來問題在於接收字節緩衝區的大小需要與存儲區一樣大。我需要將代碼轉換爲塊,因爲代碼位於web服務中。將內存分流到bytarray

任何人都知道什麼是錯,此代碼

fb.buffer是MemoryStream的

long bytesLeft = fb.Buffer.Length; 
       fb.Buffer.Position = 0; 
       int offset =0; 
       int BUFF_SIZE = 8196; 


       while (bytesLeft > 0) 
       { 
        byte[] fs = new byte[BUFF_SIZE]; 

        fb.Buffer.Read(fs, offset, BUFF_SIZE); 
        offset += BUFF_SIZE; 
        bytesLeft -= BUFF_SIZE; 
       } 
+0

其實,你甚至不需要在這裏使用'Read';只需使用'GetBuffer',然後在循環中,'Buffer.BlockCopy'將數據從後臺緩衝區中移動到更小的緩衝區中 – 2012-04-16 07:58:36

回答

2

offset這裏是偏移到數組。這裏應該是零。您還應該查看的返回的值。即使有更多數據可用,也不保證填入緩衝區,

但是,如果這是一個MemoryStream - 更好的選擇可能是ArraySegment<byte>,它不需要重複數據。

+0

謝謝,愚蠢的misstake。看到這個'不保證填充緩衝區'之前,總是想知道它的意思。讀取操作是某種類型的隨機過程還是? – klashagelqvist 2012-04-16 07:50:35

+0

@klashagelqvist在'NetworkStream'上它幾乎是。如果沒有足夠的數據到達緩衝區,但連接還沒有關閉,它只會用可用數據填充部分緩衝區,然後返回。但我不認爲這樣的部分讀取可能發生在MemoryStream上。 – CodesInChaos 2012-04-16 07:54:04

+0

+1讓我意識到'ArraySegment ' – Jodrell 2012-04-16 07:55:41

2

請看一眼this code for Stream.Read from MSDN - 你不應該增加offset - 它應該始終爲零。當然,除非你事先知道流的確切長度(因此你可以創建數組的確切大小)。

您還應該始終抓取從Read(返回值)中讀取的字節數。

如果你想將它分成'塊'你的意思是你想要ñ 8K塊?這時,你可能想要做這樣的事情:在特定

List<byte[]> chunks = new List<byte[]>(); 
byte chunk = new byte[BUFF_SIZE]; 
int bytesRead = fb.Buffer.Read(chunk, 0, BUFF_SIZE); 
while(bytesRead > 0) 
{ 
    if(bytesRead != BUFF_SIZE) 
    { 
    byte[] tail = new byte[bytesRead]; 
    Array.Copy(chunk, tail, bytesRead); 
    chunk = tail; 
    } 
    chunks.Add(chunk); 
    bytesRead = fb.Buffer.Read(chunk, 0, BUFF_SIZE); 
} 

注意,最後一塊是更可能不會是長度正好BUFF_SIZE