在不使用任何 3rd方库的情况下如何转换byte[]
为Byte[]
和?Byte[]
byte[]
有没有办法只使用标准库快速做到这一点?
字节 [] 到 字节 [] :
byte[] bytes = ...;
Byte[] byteObject = ArrayUtils.toObject(bytes);
字节[] 到字节[] :
Byte[] byteObject = new Byte[0];
byte[] bytes = ArrayUtils.toPrimitive(byteObject);
Byte
类是原始的包装器byte
。这应该做的工作:
byte[] bytes = new byte[10];
Byte[] byteObjects = new Byte[bytes.length];
int i=0;
// Associating Byte array values with bytes. (byte[] to Byte[])
for(byte b: bytes)
byteObjects[i++] = b; // Autoboxing.
....
int j=0;
// Unboxing Byte values. (Byte[] to byte[])
for(Byte b: byteObjects)
bytes[j++] = b.byteValue();
Java 8 解决方案:
Byte[] toObjects(byte[] bytesPrim) {
Byte[] bytes = new Byte[bytesPrim.length];
Arrays.setAll(bytes, n -> bytesPrim[n]);
return bytes;
}
不幸的是,您不能这样做以从 转换Byte[]
为byte[]
. Arrays
有setAll
, double[]
,int[]
和long[]
, 但没有其他原始类型。
您可以在 Apache Commons 语言库 ArrayUtils 类中使用 toPrimitive 方法,如此处所建议的 - Java - Byte[] to byte[]
byte[] toPrimitives(Byte[] oBytes)
{
byte[] bytes = new byte[oBytes.length];
for(int i = 0; i < oBytes.length; i++){
bytes[i] = oBytes[i];
}
return bytes;
}
逆:
//byte[] to Byte[]
Byte[] toObjects(byte[] bytesPrim) {
Byte[] bytes = new Byte[bytesPrim.length];
int i = 0;
for (byte b : bytesPrim) bytes[i++] = b; //Autoboxing
return bytes;
}
从字节[]到字节[]:
byte[] b = new byte[]{1,2};
Byte[] B = new Byte[b.length];
for (int i = 0; i < b.length; i++)
{
B[i] = Byte.valueOf(b[i]);
}
从 Byte[] 到 byte[] (使用我们之前定义的B
):
byte[] b2 = new byte[B.length];
for (int i = 0; i < B.length; i++)
{
b2[i] = B[i];
}
如果有人更喜欢 Stream API 而不是普通循环。
private Byte[] toObjects(byte[] bytes) {
return IntStream.range(0, bytes.length)
.mapToObj(i -> bytes[i])
.toArray(Byte[]::new);
}
退后。看看更大的图景。由于 Java 的严格类型大小写类似这样,您无法将 byte[] 转换为 Byte[] 或反之亦然
列表<字节> 或列表<字节[]>
现在你有 byte[] 和 Byte[] 并且必须转换。这会有所帮助。
将所有字节 [] 保存在这样的列表中:List<byte[]> 而不是 List< Byte> 或 List<Byte[]>。(byte 是一个原始数据,byte[] 是一个对象)
当您获取字节时,请执行以下操作(网络套接字示例):
ArrayList<byte[]> compiledMessage = new ArrayList<byte[]>;
...
compiledMessage.add(packet.getData());
然后,当您想将所有字节放在一条消息中时,请执行以下操作:
byte[] fromListOfNotByteArray (List<byte[]> list) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(list);
} catch (IOException e) {
e.printStackTrace();
}
return baos.toByteArray();
}
这样,您可以将所有部分保留在 List<byte[]> 中,将整个部分保留在 byte[] 中,而无需在 for 循环中进行一堆疯狂的复制任务,而到处都是小婴儿 byte[]。;)
现在你知道了——教别人。