[英]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.Copy或Buffer.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.