Trouver indexOf un tableau d'octets dans un autre tableau d'octets
Donné un tableau d'octets, comment trouver en son sein, la position d'un (petit) tableau d'octets?
Cette documentation avait l'air prometteur, à l'aide de ArrayUtils
, mais si je suis correct, il serait seulement permettez-moi de trouver une personne de l'octet dans le tableau de recherche.
(Je ne vois pas compter, mais juste au cas où: parfois la recherche tableau d'octets sera régulièrement des caractères ASCII, d'autres fois il sera caractères de contrôle ou de caractères ASCII étendus. Donc à l'aide d'opérations de la Chaîne ne serait pas toujours le cas)
Le grand tableau pourrait être entre 10 et environ 10000 octets, et la plus petite matrice autour de 10. Dans certains cas, je vais avoir plusieurs petits tableaux que je veux trouvées dans le grand tableau en une seule recherche. Et je vais à la fois pour trouver le dernier indice d'une instance plutôt que la première.
- Quelle est la taille du grand tableau, et comment beaucoup plus petit est le plus petit tableau? En fonction de cela, différentes approches peuvent être applicables.
- Je vous remercie pour votre question, j'ai précisé ma question
Vous devez vous connecter pour publier un commentaire.
Java chaînes sont composées de 16 bits
char
s, pas de 8 bitsbyte
s. Unchar
peut contenir unbyte
, de sorte que vous pouvez toujours faire vos tableaux d'octets dans les chaînes, et l'utilisationindexOf
: caractères ASCII, les caractères de contrôle, et même zéro personnages fonctionnent bien.Voici une démo:
Ce imprime
7
.Toutefois, considérant que votre grand tableau pourrait être jusqu'à 10 000 octets, et le petit tableau est à seulement dix octets, cette solution peut ne pas être le plus efficace, et ce pour deux raisons:
char
au lieu debyte
). Cette triples vos exigences de mémoire.new String(bytes, "UTF-8")
.{ -61, 40}
dans la chaîne{ -16, -112, 40, -68}
: votre code renvoie0
, parce que ces deux ne sont pas valides séquences que Java remplace par la valeur par défaut de remplacement de caractères UTF-8.x, y, z
, emballé commex, yz
dans une séquence contenantxy, z
).La simpelst façon serait de comparer chaque élément:
Quelques tests:
Que vous avez mis à jour votre question: Java Chaînes de caractères UTF-16 Cordes, ils ne se soucient pas de l'ASCII étendu, de sorte que vous pourrait utiliser des chaînes de caractères.indexOf()
Google Guava propose un Octets.indexOf(byte[] tableau, byte[] la cible).
goto
. n'avez pas vu cela depuis ma BASE de temps 😮Est-ce ce que vous recherchez?
D'économiser votre temps dans les essais de:
http://helpdesk.objects.com.au/java/search-a-byte-array-for-a-byte-sequence
vous donne un code qui fonctionne si vous faites computeFailure() statique:
Car il est toujours sage de tester le code que vous empruntez, vous pouvez commencer avec:
Repris presque à l'identique à partir de java.lang.Chaîne de caractères.
indexOf(char[],int,int,char[]int,int,int)
À l'aide de la
Knuth–Morris–Pratt algorithme
est le moyen le plus efficace.StreamSearcher.java
est une implémentation de il et fait partie deTwitter
'selephant-bird
projet.Il est recommandé de ne pas inclure cette librairie car il est plutôt appréciable pour aide d'une seule classe.
donc il en résulte
Donc,u peut trouver l'indice de byte[] en byte[]
Exemple sur Github à: https://github.com/riversun/finbin
Pour un petit serveur HTTP, je suis en train de travailler, je suis venu avec le code suivant pour trouver les limites dans un multipart/form-data demande. Espérer trouver une meilleure solution ici, mais je crois que je vais rester avec elle. Je pense que c'est aussi efficace qu'il le peut (assez rapide et n'utilise pas beaucoup de ram). Il utilise les octets d'entrée que l'anneau de la mémoire tampon, lit l'octet suivant dès qu'il ne correspond pas à la frontière et écrit les données après le premier cycle complet dans le flux de sortie. Bien sûr, peut-il être changé pour des tableaux d'octets au lieu de ruisseaux, comme demandé dans la question.