87

在不使用任何 3rd方库的情况下如何转换byte[]Byte[]和?Byte[]byte[]

有没有办法只使用标准库快速做到这一点?

4

8 回答 8

77

字节 [] 到 字节 [] :

byte[] bytes = ...;
Byte[] byteObject = ArrayUtils.toObject(bytes);

字节[] 到字节[] :

Byte[] byteObject = new Byte[0];
byte[] bytes = ArrayUtils.toPrimitive(byteObject);
于 2016-09-05T11:38:53.023 回答
57

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();
于 2012-10-17T22:31:13.313 回答
20

Java 8 解决方案:

Byte[] toObjects(byte[] bytesPrim) {
    Byte[] bytes = new Byte[bytesPrim.length];
    Arrays.setAll(bytes, n -> bytesPrim[n]);
    return bytes;
}

不幸的是,您不能这样做以从 转换Byte[]byte[]. ArrayssetAll, double[],int[]long[], 但没有其他原始类型。

于 2014-06-16T22:50:32.113 回答
16

您可以在 Apache Commons 语言库 ArrayUtils 类中使用 toPrimitive 方法,如此处所建议的 - Java - Byte[] to byte[]

于 2013-11-12T09:56:10.903 回答
7
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;

}
于 2014-06-16T22:43:43.703 回答
5

从字节[]到字节[]:

    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];
    }
于 2012-10-17T22:34:12.080 回答
2

如果有人更喜欢 Stream API 而不是普通循环。

private Byte[] toObjects(byte[] bytes) {
    return IntStream.range(0, bytes.length)
            .mapToObj(i -> bytes[i])
            .toArray(Byte[]::new);
}
于 2020-04-08T11:15:45.900 回答
0

退后。看看更大的图景。由于 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[]。;)

现在你知道了——教别人。

于 2022-02-21T20:14:23.380 回答