7
votes

Comment puis-je obtenir efficacement un sous-ensemble d'un tableau d'octets (premier n éléments) en C #?

J'ai un tampon de tableau d'octets de taille max 1k. Je veux écrire un sous-ensemble de la matrice (le début du sous-ensemble sera toujours élément 0, mais la longueur que nous souhaitons intéresser est dans une variable).

L'application ici est la compression. Je passe dans un tampon à une fonction de compression. Pour la simplicité, supposons que la compression entraînera des données égales ou inférieures à 1k octets. xxx

J'aimerais vraiment éviter une copie ici - elle semble complètement inutile que toutes les données nécessaires sont dans tampon déjà.


0 commentaires

5 Réponses :


6
votes

Si vous ne pouvez pas changer la signature de la méthode, vous êtes bloqué. Vous ne pouvez pas créer une "vue" sur un tableau d'octets avec type d'octet [] . La solution idéale pour cela serait pour l'opération de prendre un arrayser ou un octet [] suivi d'un décalage et d'un compte. Si vous ne pouvez vraiment pas changer la méthode d'écriture, vous êtes malheureusement bloqué par la création d'un nouveau tableau et copier les données.


1 commentaires

Wow, vous m'avez aidé avec WCF avant (en tant qu'utilisateur différent). Merci encore pour la pointe Carlos +1.



2
votes

Si la signature de la méthode est (octet []) Vous ne pouvez rien faire d'autre que Copier.

Si vous pouvez changer de signature:

  • Streams prend en charge les sous-ensembles de tableaux, de sorte qu'il n'est pas une demande inhabituelle d'avoir une signature comme stream.write :

    abstrait public vide écrit ( byte [] tampon, Int Offset, int compte)

  • L'autre option consiste à réussir iEnumerable afin que vous puissiez trancher votre tableau de n'importe quelle manière que vous voulez sans copie.


0 commentaires

12
votes

tampon.blockCopy serait mon choix.

Microsoft Exemple: http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx xxx

Votre code ressemblerait à: xxx


0 commentaires

3
votes

Il n'y a aucun moyen que vous puissiez le faire. Array.Resize au lieu de changer la longueur de la matrice, la copie simplement à un Nouvelle instance de tableau.

Cependant, vous pouvez utiliser le Classe tampon , qui a une meilleure performance:

La mémoire tampon fournit des méthodes permettant de copier des octets d'une gamme de types primitifs vers un autre tableau de types primitifs, obtenez un octet à partir d'une matrice, définissez un octet dans une matrice et obtenez la longueur d'un tableau. Cette classe offre de meilleures performances pour manipuler des types primitifs que des méthodes similaires dans la classe System.Array.

Ceci correspond à vos besoins, car vous avez un tableau d'octets et l'octet est un type primitif.


0 commentaires

6
votes
    byte[] b = new Byte[] {1, 2, 3, 4, 5};
    IEnumerable<Byte> middle = b.Skip(2).Take(3);
This should let you get any middle section that you like.  This most likely makes a copy, but I don't think you should attempt to avoid that.

0 commentaires