我们使用这种小实用方法。但我们不喜欢它。因为它不是非常重要(无论如何......),我们已经忘记了它
但那很难看,因为我们必须通过整个阵列,才能进行转换
它从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);
}
答案 0 :(得分:8)
你的方法几乎是唯一的方法。您可能会找到一个可以完成全部或部分内容的外部库,但它基本上会做同样的事情。
但是,代码中有一件事是潜在的问题:调用new String(array)
时,您使用平台默认编码将字节转换为字符。平台编码在操作系统和区域设置之间有所不同 - 使用它几乎总是等待发生的错误。它取决于你从哪里得到这些字节,但是它们的编码应该在某处指定,作为参数传递给方法并用于转换(通过使用带有第二个参数的String构造函数)。
答案 1 :(得分:3)
import org.apache.commons.lang.ArrayUtils;
...
Byte[] bytes = new Byte[l.size()];
l.toArray(bytes);
byte[] b = ArrayUtils.toPrimitive(bytes);
答案 2 :(得分:1)
没有任何额外的库(例如apache commons)你的方法很好
答案 3 :(得分:1)
Minor nit:
if (l == null || l.isEmpty() ) {
return "" ;
}
避免为空列表创建空字符串。
答案 4 :(得分:1)
Guava提供了许多有用的primitive utilities,包括Bytes
类,可以对Byte
的集合进行此操作和其他操作。
private static String toString(List<Byte> bytes) {
return new String(Bytes.toArray(bytes), StandardCharsets.UTF_8);
}
答案 5 :(得分: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();
}
但我真的不认为我会推荐这么简单的东西。
答案 6 :(得分:-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 - 你需要尝试在某处捕获它。
答案 7 :(得分:-2)
查看BitConverter课程,我认为它可以满足您的需求。将它与List.toArray()方法结合使用。