5

この小さなユーティリティメソッドを使用します。しかし、私たちはそれが好きではありません。それほど重要ではないので (とにかく動作します...)、忘れてしまいました。
しかし、配列全体を調べて、 から に変換するだけなので、これは見苦しいByte[]ですbyte[]
見ている :

  • 通過せずにキャストするByte[]方法byte[]
  • またはリストを文字列にキャストするためのユーティリティメソッドの場合

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);
}
4

8 に答える 8

8

あなたの方法は、それを行う唯一の方法です。そのすべてまたは一部を実行する外部ライブラリが見つかる場合がありますが、基本的には同じことを行います。

ただし、コードには潜在的な問題が 1 つあります。 を呼び出すときnew String(array)に、プラットフォームのデフォルトのエンコーディングを使用してバイトを文字に変換しています。プラットフォームのエンコーディングは、オペレーティング システムとロケールの設定によって異なります。これを使用すると、ほとんどの場合、発生するのを待っているバグになります。これらのバイトをどこから取得するかによって異なりますが、エンコーディングをどこかで指定し、引数としてメソッドに渡し、変換に使用する必要があります (2 番目のパラメーターで String コンストラクターを使用して)。

于 2009-07-08T09:56:09.683 に答える
3
import org.apache.commons.lang.ArrayUtils;

...

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

byte[] b =  ArrayUtils.toPrimitive(bytes);
于 2009-07-08T08:49:11.253 に答える
1

マイナーニット:

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

空のリストに空の文字列を作成しないようにします。

于 2009-07-08T10:02:43.710 に答える
1

追加のライブラリ (Apache Commons など) がなくても、メソッドは問題ありません

于 2009-07-08T08:57:14.280 に答える
1

Guavaは、s のコレクションに対するこの操作やその他の操作を簡単にするクラスを含む、多くの便利なプリミティブ ユーティリティを提供します。BytesByte

private static String toString(List<Byte> bytes) {
  return new String(Bytes.toArray(bytes), StandardCharsets.UTF_8);
}
于 2015-06-25T22:32:13.303 に答える
0

java.nio を使用して、このようなものを思いつくことができます

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();
}

しかし、これほど単純なものはお勧めしません。

于 2009-07-08T12:11:59.627 に答える
-1

1 つのオプションは、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();
}

または、文字変換が必要な場合

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");
}

バイトを集約する場合は、最初に List of bytes の代わりに ByteArrayOutputStream を試してください。注: UnsupportedEncodingException に注意してください。どこかで試してキャッチする必要があります。

于 2009-07-08T09:43:52.813 に答える
-2

BitConverterクラスをチェックしてください。あなたが望むことをすると思います。List.toArray() メソッドと組み合わせて使用​​します。

于 2009-07-08T08:45:39.920 に答える