Question

Nous utilisons cette petite méthode utilitaire. Mais nous ne l'aimons pas. Comme il est pas très important (ça marche quand même ...), nous l'avons oublié.
Mais ce qui est laid, parce que nous devons passer par tout le tableau, pour convertir il de Byte[] à byte[].
Je suis à la recherche:

  • pour un moyen de jeter le Byte[] dans byte[] sans passer par elle
  • ou pour un procédé d'utilité pour la distribution d'une liste dans la chaîne

public static String byteListToString(List<Byte> l, Charset charset) {
    if (l == null) {
        return "";
    }
    byte[] array = new byte[l.size()];
    int i = 0;
    for (Byte current : l) {
        array[i] = current;
        i++;
    }
    return new String(array, charset);
}
Était-ce utile?

La solution

Votre méthode est à peu près la seule façon de le faire. Vous trouverez peut-être une bibliothèque externe qui fait tout ou partie de celui-ci, mais il sera essentiellement faire la même chose.

Cependant, il y a une chose dans votre code qui est un problème potentiel: Lorsque vous appelez new String(array), vous utilisez l'encodage par défaut de la plate-forme pour convertir les octets en caractères. Le codage de la plate-forme est différente entre le système d'exploitation et les paramètres régionaux - l'utiliser est presque toujours un bug en attente de se produire. Cela dépend de l'endroit où vous obtenez ces octets à partir, mais leur codage doit être spécifié quelque part, passé comme argument à la méthode et utilisé pour la conversion (en utilisant le constructeur String avec un second paramètre).

Autres conseils

import org.apache.commons.lang.ArrayUtils;

...

Byte[] bytes = new Byte[l.size()];
l.toArray(bytes);

byte[] b =  ArrayUtils.toPrimitive(bytes);

sans aucune bibliothèque supplémentaire (par exemple des communes apache) votre méthode est bien

nit mineur:

if (l == null || l.isEmpty() ) {
    return "" ;
}

pour éviter de créer des chaînes vides pour les listes vides.

Goyave fournit un certain nombre d'informations utiles utilitaires primitifs , y compris un Bytes classe qui fait cela et d'autres opérations sur les collections de Bytes trivial.

private static String toString(List<Byte> bytes) {
  return new String(Bytes.toArray(bytes), StandardCharsets.UTF_8);
}

Vous pouvez utiliser java.nio et venir avec quelque chose comme ça

public static String byteListToString(List<Byte> l, Charset cs)
throws IOException
{
    final int CBUF_SIZE = 8;
    final int BBUF_SIZE = 8;

    CharBuffer cbuf = CharBuffer.allocate(CBUF_SIZE);
    char[] chArr = cbuf.array();
    ByteBuffer bbuf = ByteBuffer.allocate(BBUF_SIZE);
    CharsetDecoder dec = cs.newDecoder();
    StringWriter sw = new StringWriter((int)(l.size() * dec.averageCharsPerByte()));

    Iterator<Byte> itInput = l.iterator();
    int bytesRemaining = l.size();
    boolean finished = false;
    while (! finished)
    {
        // work out how much data we are likely to be able to read
        final int bPos = bbuf.position();
        final int bLim = bbuf.limit();
        int bSize = bLim-bPos;
        bSize = Math.min(bSize, bytesRemaining);
        while ((--bSize >= 0) && itInput.hasNext()) 
        {
            bbuf.put(itInput.next().byteValue());
            --bytesRemaining;
        }
        bbuf.flip();
        final int cStartPos = cbuf.position();
        CoderResult cr = dec.decode(bbuf, cbuf, (bytesRemaining <= 0));
        if (cr.isError()) cr.throwException();
        bbuf.compact();
        finished = (bytesRemaining <= 0) && (cr == CoderResult.UNDERFLOW);
        final int cEndPos = cbuf.position();
        final int cSize = cEndPos - cStartPos;
        sw.write(chArr, cStartPos, cSize);
        cbuf.clear();
    }
    return sw.toString();
}

mais je ne pense vraiment pas que je vous recommande quelque chose de ce simple.

Une option pourrait consister à utiliser StringBuilder:

public static String byteListToString(List<Byte> l) {
    if (l == null) {
        return "" ;
    }
    StringBuilder sb = new StringBuilder(l.size());

    for (Byte current : l) {
        sb.append((char)current);
    }

    return sb.toString();
}

Ou, si vous avez besoin de conversion de caractères

public static String byteListToString(List<Byte> l) {
    if (l == null) {
        return "" ;
    }
    ByteArrayOutputStream bout = new ByteArrayOutputStream(l.size());

    for (Byte current : l) {
        bout.write(current);
    }

    return bout.toString("UTF-8");
}

Si vous octets l'agrégation, essayez ByteArrayOutputStream en premier lieu au lieu de la liste d'octets. Note: Attention au UnsupportedEncodingException - vous devrez essayer la capture accessoire quelque part

.

Consultez la classe BitConverter , je pense qu'il Est-ce que ce que vous voulez. Il permet, en combinaison avec la méthode List.toArray ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top