Comment diviser un tableau d'octets
J'ai un tableau d'octets en mémoire, lu à partir d'un fichier. Je voudrais diviser le tableau d'octets à un certain point (index) sans avoir à simplement créer un nouveau tableau d'octets et de copie de chaque octet à la fois, l'augmentation de la mémoire pied d'impression de l'opération. Ce que je voudrais, c'est quelque chose comme ceci:
byte[] largeBytes = [1,2,3,4,5,6,7,8,9];
byte[] smallPortion;
smallPortion = split(largeBytes, 3);
smallPortion
serait égal à 1,2,3,4
largeBytes
serait égal à 5,6,7,8,9
Vous devez vous connecter pour publier un commentaire.
C'est de cette façon que je le ferais:
FYI.
System.ArraySegment<T>
structure est essentiellement la même chose queArrayView<T>
dans le code ci-dessus. Vous pouvez utiliser cette out-of-the-box structure de la même façon, si vous le souhaitez.En C#, Linq, vous pouvez le faire:
😉
ArraySegment<T>
..IEnumerable<byte>
. Il est tout à fait sûr (et rapide) pour itérer sur que énumérable plusieurs fois il y a deux inconvénients: a) vous ne pouvez toujours pas d'indice dans cette section du tableau directement. Bien sûr, le LINQ implémentations de Passer/prendre Prendre avantage de la structure du tableau, mais ils le font en essayant de jeter le IEnumerable de Collection ou un Tableau. b) une Fois que vous retournez un IEnumerable de votre API, les clients ne sont plus garantie (par le système de type) que l'énumérable est sûr et efficace pour itérer plusieurs fois.Essayez celui-ci:
Je ne suis pas sûr de ce que tu veux dire par:
Dans la plupart des langues, certes C#, une fois que le tableau a été alloué, il n'y a aucun moyen de changer la taille de celui-ci. Il semble que vous êtes à la recherche d'un moyen pour modifier la longueur d'un tableau, qui vous ne pouvez pas. Vous aussi, vous souhaitez recycler en quelque sorte la mémoire de la deuxième partie du tableau, afin de créer un deuxième tableau, vous aussi ne peut pas le faire.
En résumé: il suffit de créer un nouveau tableau.
Comme Eren a dit, vous pouvez utiliser
ArraySegment<T>
. Voici une méthode d'extension et exemple d'utilisation:Vous ne pouvez pas. Ce que vous voulez est de garder un point de départ et le nombre d'éléments; en substance, construire des itérateurs. Si c'est le C++, vous pouvez simplement utiliser
std::vector<int>
et servez-vous-en.En C#, j'aimerais construire une petite itérateur classe qui contient les index de début, le comte et la met en œuvre
IEnumerable<>
.