需要循环来从字节数组中复制块

时间:2009-02-24 22:47:07

标签: c# bytearray

我必须处理一个传递给我的函数的大字节数组。我需要将来自此传入字节数组的内容以较小的“块”复制到出站字节数组。

对于在出站阵列中创建的每个“数据块”,我需要调用一个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 
 }

我知道这是一团糟,不会奏效;有人可以草拟一个合适的循环来完成这项工作吗?非常感谢。

5 个答案:

答案 0 :(得分:18)

您可能希望查看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
 }

答案 1 :(得分: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();

答案 2 :(得分:3)

为什么不使用Array.Copy? http://msdn.microsoft.com/en-us/library/system.array.copy.aspx

例如

Array.Copy(srcBuffer, destBuffer, 1024);

答案 3 :(得分:0)

警惕同步循环调用Web服务。由于HTTP的性质,同步Web服务调用会花费无限时间,并且您的循环可能会运行很长时间。最好使用异步方法。

答案 4 :(得分:-2)

你似乎在逻辑上打破了你的任务,毕竟,你已经用文字连贯地描述了它。现在让你的代码去做吧。

伪代码可能类似于:

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