Comment diviser un tableau d'octets autour d'une séquence d'octets en Java?
Comment scinder une byte[]
autour d'une séquence d'octets en Java? Quelque chose comme la byte[]
version de String#split(regex)
.
Exemple
Prenons ce tableau d'octets:
[11 11 FF FF 22 22 22 FF FF 33 33 33 33]
et laissez-les choisir le délimiteur à être
[FF FF]
Puis la scission aura le résultat de ces trois parties:
[11 11]
[22 22 22]
[33 33 33 33]
EDIT:
Veuillez noter que vous ne pouvez pas convertir le byte[]
à String
de la diviser ensuite, puis de retour en raison de problèmes de codage. Lorsque vous effectuez la conversion sur les tableaux d'octets, la byte[]
sera différent. Veuillez vous référer à ceci:
La Conversion de byte[] dans une Chaîne, puis de nouveau à un byte[]
source d'informationauteur Ori Popowski
Vous devez vous connecter pour publier un commentaire.
Notez que vous pouvez convertir fiable de byte[] à la Chaîne et à l'arrière, avec un one-to-one mapping de caractères d'octets, si vous utilisez le codage "iso8859-1".
Cependant, il est toujours une vilaine solution.
Je pense que vous aurez besoin pour restaurer votre propre.
Je suggère de le résoudre en deux étapes:
Ici, c'est à l'aide d'un naïfs algorithme de recherche de motif. KMP deviendrait-il la peine si les délimiteurs sont longues (parce qu'il enregistre les retours en arrière, mais ne manquez pas de délimiteurs si elles sont imbriquées dans la séquence de l'inadéquation à la fin).
Voici une solution simple et efficace.
Contrairement à avgvstvs approche poignées de longueur arbitraire des délimiteurs. La réponse sommet est également bon, mais l'auteur n'a pas résolu le problème souligné par Eitan Perkal. Ce problème est évité ici à l'aide de l'approche Perkal suggère.
J'ai modifié 'L. Blanc", la réponse à la poignée des délimiteurs au début et à la fin. En Plus je le renomme en "split".
Roulement de votre propre est la seule façon d'aller ici. La meilleure idée que je peux vous offrir, si vous êtes ouvert à des non-standard des bibliothèques, c'est cette classe d'Apache:
http://commons.apache.org/proper/commons-primitives/apidocs/org/apache/commons/collections/primitives/ArrayByteList.html
Knuth la solution est sans doute le meilleur, mais je traiterais le tableau comme une pile et faire quelque chose comme ceci:
Je suis conscient que c'est assez rapide et sale, mais il devrait fournir de O(n) dans tous les cas.
Vous pouvez utiliser
Tableaux.copyOfRange()
.Reportez-vous à Java Doc pour la Chaîne
Vous pouvez construire une
String
objet debyte
tableau. Suppose que vous savez le reste.