繁体   English   中英

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

[英]Need loop to copy chunks from byte array

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

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

我知道这是一团糟,而且行不通; 有人可以绘制一个适当的循环来完成这项工作吗? 非常感谢。

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

您可能需要Buffer.BlockCopy (最原始的副本;非常适合byte[] )。

当然,另一种选择是使用MemoryStream代替出站数组,每次只Write它,然后在MemoryStream上调用ToArray()GetBuffer() (使用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();

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

例如。

Array.Copy(srcBuffer, destBuffer, 1024);

小心在循环中同步调用 web-services。 由于 HTTP 的性质,同步 Web 服务调用需要无限时间,并且您的循环可能会运行很长时间。 最好使用异步方法。

你似乎已经逻辑地分解了你的任务,毕竟你已经用文字连贯地描述了它。 现在只需让您的代码执行此操作。

伪代码可能类似于:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM