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

你的方法几乎是唯一的方法。您可能会发现一个外部库可以完成全部或部分工作,但它本质上会做同样的事情。

但是,您的代码中有一个潜在问题:调用 时new String(array),您正在使用平台默认编码将字节转换为字符。操作系统和区域设置之间的平台编码不同 - 使用它几乎总是一个等待发生的错误。这取决于您从哪里获取这些字节,但它们的编码应该在某处指定,作为参数传递给方法并用于转换(通过使用带有第二个参数的 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

没有任何额外的库(例如 apache commons)你的方法很好

于 2009-07-08T08:57:14.280 回答
1

小尼特:

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

避免为空列表创建空字符串。

于 2009-07-08T10:02:43.710 回答
1

Guava提供了许多有用的原始实用程序,包括一个使对sBytes集合进行此操作和其他操作的类。Byte

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

一种选择可能是使用 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");
}

如果您正在聚合字节,请首先尝试 ByteArrayOutputStream 而不是字节列表。注意:注意 UnsupportedEncodingException - 您需要在某处尝试捕捉它。

于 2009-07-08T09:43:52.813 回答
-2

查看BitConverter类,我认为它可以满足您的需求。将它与 List.toArray() 方法结合使用。

于 2009-07-08T08:45:39.920 回答