Comment allourais-je retirer un certain nombre d'octets d'un tableau d'octets? P>
4 Réponses :
Vous pouvez le faire:
using System.Linq // ... var newArray = oldArray.Skip(numBytes).ToArray();
Si vous ne pouvez pas utiliser Linq, vous pouvez le faire de cette façon:
byte[] myArray = // however you acquire the array byte[] newArray = new byte[myArray.Length - 16]; for (int i = 0; i < newArray.Length; i++) { newArray[i] = myArray[i + 16]; } // newArray is now myArray minus the first 16 bytes
Edit: Comme le mentionne le commentaire de Nobugz (et la réponse de Reed Copsey), si vous n'avez pas besoin du résultat en tant que tableau d'octets, vous devez rechercher à l'aide d'utiliser TRAYSEGEMENT
:
byte[] newArray = new byte[oldArray.Length - 16]; Array.Copy(oldArray, 16, newArray, 0, newArray.Length);
Quelle est la différence entre tampon.blockcopy et array.copy lorsqu'il est utilisé avec des tableaux d'octets?
@DTB: Je ne m'attends pas à une différence fonctionnelle dans ce cas. tampon.blockCopy code> est un peu plus restrictif - je soupçonne qu'il est mis en œuvre de manière inférieure, mais je ne connais pas les détails.
@DTB: il apparaît de la documentation MSDN selon laquelle Array.copy code> copie le tableau un élément à la fois (Docs Say:
Cette méthode est une opération O (n), où n est longueur code>), mais
tampon.blockCopy code> copie un bloc d'octets dans son ensemble (je suppose créer un autre tableau temporairement pour stocker les octets copiés).
@ZACH: Pourquoi d'entre eux aurait-il besoin d'une matrice temporaire, sauf si elles ne copient d'une section d'un tableau à une section qui se chevauchent du même tableau?
@Jon Skeet: il ressemble à la documentation sur tampon.blockcopy code>, msdn.microsoft.com/en-us/library/system.buffer.blockcopy.asp x , qu'il est destiné à être utilisé dans lequel vous pouvez copier des sections qui se chevauchent. Du Docs: "Comme son nom l'indique, la méthode BlockCopy copie un bloc d'octets dans son ensemble, plutôt que de copier un octet à la fois. Par conséquent, si SRC et DST référence le même tableau et la gamme de SRCOffset + Count - 1 chevauche la plage de la plage de DSTOffset + Count - 1, les valeurs des octets qui se chevauchent ne sont pas écrasées avant leur copie sur la destination. "
@Zach: Il est destiné à COPE I> avec des sections qui se chevauchent, mais je doute qu'il copie deux fois si cela n'a pas besoin.
Je mentionnerai également - en fonction de la manière dont vous envisagez d'utiliser les résultats, souvent, une approche alternative consiste à utiliser ArraySegment
Pour accéder à la partie restante de la matrice. Cela empêche la nécessité de copier la matrice, qui peut être plus efficace dans certains scénarios d'utilisation:
ArraySegment<byte> segment = new ArraySegment<byte>(originalArray, 16, originalArray.Length-16); // Use segment how you'd use your array...
Une autre imparfaite alors question, nous enlevons beaucoup d'entre eux ces derniers temps. Distinguée par une question de phrase unique qui ne fait pas grand chose pour expliquer le titre. De loin, la meilleure approche est de ne pas le faire. De nombreuses méthodes qui prennent une matrice ont une surcharge qui prend une compensation et une longueur. Il y a même une classe dédiée pour cela: Arraysegment. Que cela vous aiderait à vous aider à être pas clair de votre question. Probablement pas.