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. P> J'aimerais vraiment éviter une copie ici - elle semble complètement inutile que toutes les données nécessaires sont dans tampon code> déjà. p> p>
5 Réponses :
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 [] em>. La solution idéale pour cela serait pour l'opération de prendre un arrayser [] code> 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. P>
Wow, vous m'avez aidé avec WCF avant (en tant qu'utilisateur différent). Merci encore pour la pointe Carlos +1.
Si la signature de la méthode est Si vous pouvez changer de signature: p>
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 : p>
L'autre option consiste à réussir (octet []) code> Vous ne pouvez rien faire d'autre que Copier. P>
abstrait public vide écrit (
byte [] tampon,
Int Offset,
int compte) code> p> li>
iEnumerable
tampon.blockCopy serait mon choix.
Microsoft Exemple: http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx p> Votre code ressemblerait à: p>
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. P>
Cependant, vous pouvez utiliser le Classe tampon , qui a une meilleure performance: p>
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. P> blockQuote>
Ceci correspond à vos besoins, car vous avez un tableau d'octets et l'octet est un type primitif. P>
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.