Besoin d’une boucle pour copier des morceaux d’un tableau d’octets

Je dois traiter un tableau d’octets volumineux qui est transmis à ma fonction. J’ai besoin de copier le contenu de ce tableau d’octets entrant en plus petits “morceaux” dans un tableau d’octets sortant.

Pour chaque “bloc” de données créé dans le tableau sortant, je dois appeler un service Web.

À mon retour, je dois reprendre la boucle dans le tableau d’octets entrants, en continuant à transmettre un bloc de données entier ou partiel jusqu’à ce que le tableau complet soit traité (c’est-à-dire envoyé au service Web par lots).

Je suis très nouveau en C # et je me bats avec une boucle qui fonctionne. Je sais comment appeler le service Web pour gérer un “bloc”, mais je ne parviens pas à obtenir une boucle correcte. Voici un aperçu du désordre pathétique que j’ai actuellement:

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 } 

Je sais que c’est un désordre et ne fonctionnera pas; quelqu’un pourrait-il esquisser une bonne boucle pour y arriver? Merci beaucoup.

Vous voudrez peut-être regarder dans Array.Copy ou Buffer.BlockCopy ; cela va nettoyer un peu les choses, car vous n’aurez pas à copier tous les octets individuellement:

 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 } 

Vous voulez probablement Buffer.BlockCopy (le plus brut des copies; idéal pour byte[] ).

Bien entendu, l’autre option consiste à utiliser un MemoryStream à la place du tableau sortant et à y Write à chaque fois, puis à appeler ToArray() ou GetBuffer() sur le MemoryStream (avec GetBuffer() , vous devez surveiller la longueur. ; avec ToArray() il est coupé automatiquement pour vous):

 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(); 

Pourquoi ne pas simplement utiliser Array.Copy? http://msdn.microsoft.com/en-us/library/system.array.copy.aspx

par exemple.

 Array.Copy(srcBuffer, destBuffer, 1024); 

Méfiez-vous des appels de services Web en boucle synchronisés. En raison de la nature de HTTP, les appels de service Web synchronisés prennent un temps indéfini et votre boucle peut s’exécuter longtemps. Il est préférable d’utiliser une approche asynchrone.

Vous semblez avoir logiquement divisé votre tâche, après tout, vous l’avez décrite de manière cohérente avec des mots. Maintenant, faites votre code le faire.

Le pseudo-code pourrait être quelque chose comme:

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