2009-02-24 56 views
8

我必須處理傳遞給我的函數的大字節數組。我需要將這個傳入的字節數組中的內容以較小的「塊」複製到出站字節數組中。需要循環從字節數組中複製塊

對於在出站陣列中創建的每個「塊」數據,我需要調用一個Web服務。返回後,我需要繼續循環傳入的字節數組,繼續傳遞整個或部分數據塊,直到處理完整的傳入數組爲止(即以塊發送到Web服務)。

我對C#非常陌生,而且我正在努力尋找一個可行的循環。我知道如何調用Web服務來處理「塊」,但我無法獲得正確的循環。這裏是我現在有的可憐的混亂的草圖:

int chunkSize = 10000; 
byte[] outboundBuffer = new byte[chunkSize];  
while (BytesRead > 0) 
{ 
long i = 0; 
foreach (byte x in incomingArray) 
{ 
    BytesRead += 1; 
    outboundBuffer[i] = incomingArray[i] 
    i++; 
} 
uploadObject.Size = BytesRead; 
uploadObject.MTOMPayload = outboundBuffer; 

// call web service here and pass the uploadObject 

// get next "chunk" until incomingArray is fully processed 
} 

我知道這是一團糟,不會工作;有人可以勾畫一個適當的循環來完成這個任務嗎?非常感謝。

回答

17

你可能想看看Array.CopyBuffer.BlockCopy;這將清理了一點東西,因爲你不會有單獨複製的所有字節:

int incomingOffset = 0; 

while(incomingOffset < incomingArray.Length) 
{ 
    int length = 
     Math.Min(outboundBuffer.Length, incomingArray.Length - incomingOffset); 

    // Changed from Array.Copy as per Marc's suggestion 
    Buffer.BlockCopy(incomingArray, incomingOffset, 
        outboundBuffer, 0, 
        length); 

    incomingOffset += length; 

    // Transmit outbound buffer 
} 
+0

此代碼對我很好。非常感謝你的幫助。 – 2009-02-25 17:05:52

-1

你似乎在邏輯上進行細分的任務,畢竟,你連貫用言語形容。現在就讓你的代碼去做吧。

僞代碼可能是這樣的:

while (there are chunks in incoming array) 
    copy 1 chunk to outbound array 
    create uploadObject 
    call webservice 
endwhile 
4

你可能想Buffer.BlockCopy(最原始的副本;非常適合於byte[])。

當然,另一種選擇是到位的出境陣列的使用MemoryStream,只是每次Write它,然後調用ToArray()GetBuffer()MemoryStream(與GetBuffer(),您需要觀看的長度;用ToArray()就會自動剪裁你):

MemoryStream ms = new MemoryStream(); 
byte[] buffer = new byte[BUFFER_SIZE]; 
int bytesReceived; 
while((bytesReceived = GetNextChunk(buffer, 0, BUFFER_SIZE)) > 0) { 
    ms.Write(incomingArray, 0, bytesReceived); 
} 
byte[] final = ms.ToArray(); 
0

警惕在一個循環中調用Web服務同步的。由於HTTP的性質,同步Web服務調用需要無限期的時間,並且您的循環可能會運行很長時間。最好使用異步方法。