Est-ce une approche correcte pour convertir ByteBuffer en String de cette manière,
String k = "abcd";
ByteBuffer b = ByteBuffer.wrap(k.getBytes());
String v = new String(b.array());
if(k.equals(v))
System.out.println("it worked");
else
System.out.println("did not work");
La raison pour laquelle je pose la question est que cela semble trop simple, alors que d'autres approches comme Java: convertir une chaîne vers et depuis ByteBuffer et les problèmes associés semblent plus complexes.
java
string
serialization
bytearray
vikky.rk
la source
la source
Réponses:
EDIT (2018): La réponse des frères et sœurs éditée par @xinyongCheng est une approche plus simple et devrait être la réponse acceptée.
Votre approche serait raisonnable si vous saviez que les octets sont dans le jeu de caractères par défaut de la plate-forme. Dans votre exemple, cela est vrai car
k.getBytes()
renvoie les octets du jeu de caractères par défaut de la plateforme.Plus fréquemment, vous voudrez spécifier l'encodage. Cependant, il existe un moyen plus simple de le faire que la question que vous avez liée. L'API String fournit des méthodes qui convertissent entre un tableau String et un tableau d'octets [] dans un codage particulier. Ces méthodes suggèrent d'utiliser CharsetEncoder / CharsetDecoder "lorsqu'un contrôle accru sur le processus de décodage [d'encodage] est nécessaire".
Pour obtenir les octets d'une chaîne dans un encodage particulier, vous pouvez utiliser une méthode getBytes () sœur:
Pour placer des octets avec un encodage particulier dans une chaîne, vous pouvez utiliser un constructeur de chaîne différent:
Notez qu'il
ByteBuffer.array()
s'agit d'une opération facultative. Si vous avez construit votre ByteBuffer avec un tableau, vous pouvez utiliser ce tableau directement. Sinon, si vous voulez être sûr, utilisezByteBuffer.get(byte[] dst, int offset, int length)
pour obtenir des octets du tampon dans un tableau d'octets.la source
ByteBuffer.get
fonction, l'entrée est à nouveau un tableau d'octets, comment puis-je l'obtenir? cela n'a aucun sens de redire k.getbytes, n'est-ce pas?ByteBuffer.get(byte[] dst, int offset, int length)
. Vous pouvez en construire une String avec le constructeur String () `String (byte [] bytes, int offset, int length, Charset charset). Vous pouvez utiliser les mêmes valeurs de décalage et de longueur pour les deux appels.k
est une chaîne, pas un ByteBuffer.Il existe une approche plus simple pour décoder un
ByteBuffer
en unString
sans aucun problème, mentionné par Andy Thomas.la source
CharBuffer
decode()
retour est unCharSequence
(commeString
), vous pouvez donc éviter une copie supplémentaire et l'utiliser directement.Essaye ça:
NB. vous ne pouvez pas convertir correctement un tableau d'octets en chaîne sans connaître son codage.
J'espère que ça aide
la source
.array()
peuvent donc lever une exception..array()
méthode.array()
, vous devez également utiliserarrayOffset()
pour démarrer à la bonne position dans le tableau! C'est un piège subtil, car généralement arrayOffset () vaut 0; mais dans les rares cas où ce n'est pas le cas, vous aurez des bogues difficiles à trouver si vous ne le prenez pas en compte.Je voulais juste souligner qu'il n'est pas sûr de supposer que ByteBuffer.array () fonctionnera toujours.
En général, buffer.hasArray () sera toujours vrai ou faux selon votre cas d'utilisation. En pratique, à moins que vous ne souhaitiez vraiment que cela fonctionne en toutes circonstances, il est prudent d'optimiser la branche dont vous n'avez pas besoin. Mais le reste des réponses peut ne pas fonctionner avec un ByteBuffer qui a été créé via ByteBuffer.allocateDirect ().
la source
ByteBuffer.wrap(bytes, offset, size)
usine.array()
, lebytes
tableau entier sera renvoyé . Mieux vaut utiliser la forme suggérée par xinyong Chengarray()
, vous devez également utiliserarrayOffset()
pour démarrer à la bonne position dans le tableau! C'est un piège subtil, car généralement arrayOffset () vaut 0; mais dans les rares cas où ce n'est pas le cas, vous aurez des bogues difficiles à trouver si vous ne le prenez pas en compte.Les réponses faisant référence à un simple appel
array()
ne sont pas tout à fait correctes: lorsque le tampon a été partiellement consommé, ou fait référence à une partie d'un tableau (vous pouvezByteBuffer.wrap
un tableau à un offset donné, pas forcément depuis le début), il faut tenir compte de cela dans nos calculs. C'est la solution générale qui fonctionne pour les tampons dans tous les cas (ne couvre pas l'encodage):Pour les préoccupations liées à l'encodage, voir la réponse d'Andy Thomas.
la source
la racine de cette question est de savoir comment décoder des octets en chaîne?
cela peut être fait avec le JAVA NIO CharSet:
public final CharBuffer decode(ByteBuffer bb)
la source
Notez (mis à part le problème de codage) que certains des codes les plus compliqués liés ont la difficulté d'obtenir la partie "active" du ByteBuffer en question (par exemple en utilisant la position et la limite), plutôt que de simplement coder tous les octets dans tout le tableau de support (comme le font de nombreux exemples de ces réponses).
la source
Convertissez une chaîne en ByteBuffer, puis de ByteBuffer en String en utilisant Java:
Qui imprime d'abord la chaîne nue imprimée, puis le ByteBuffer converti en array ():
Cela m'a également été utile, réduire la chaîne en octets primitifs peut aider à inspecter ce qui se passe:
Imprime votre chaîne interprétée comme UTF-8, puis à nouveau comme ISO-8859-1:
la source
la source
Voici une fonction simple pour convertir un tampon d'octets en chaîne:
la source