8
votes

Supprimer les 16 premiers octets?

Comment allourais-je retirer un certain nombre d'octets d'un tableau d'octets?


1 commentaires

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.


4 Réponses :


17
votes

Vous pouvez le faire:

using System.Linq

// ...

var newArray = oldArray.Skip(numBytes).ToArray();


0 commentaires

0
votes

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


0 commentaires

28
votes

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 CODE> :

byte[] newArray = new byte[oldArray.Length - 16];
Array.Copy(oldArray, 16, newArray, 0, newArray.Length);


6 commentaires

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 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 copie le tableau un élément à la fois (Docs Say: Cette méthode est une opération O (n), où n est longueur ), mais tampon.blockCopy 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 , 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 avec des sections qui se chevauchent, mais je doute qu'il copie deux fois si cela n'a pas besoin.



6
votes

Je mentionnerai également - en fonction de la manière dont vous envisagez d'utiliser les résultats, souvent, une approche alternative consiste à utiliser ArraySegment code> 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...  


0 commentaires