java 如何将byte[]转换为Byte[],以及如何将Byte []转换为byte []?

44u64gxh  于 2023-02-07  发布在  Java
关注(0)|答案(9)|浏览(354)

在不使用任何第三方库的情况下,如何将byte[]转换为Byte[]以及将Byte[]转换为byte[]
有没有一种方法可以只用标准库就快速完成呢?

wfsdck30

wfsdck301#

字节[]到字节[]:

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

字节[]至字节[]:

Byte[] byteObject = new Byte[0];
byte[] bytes = ArrayUtils.toPrimitive(byteObject);
cedebl8k

cedebl8k2#

Byte类是原语byte的一个 * Package 器 *。

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();
46scxncf

46scxncf3#

Java 8解决方案:

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

不幸的是,您不能这样做来将Byte[]转换为byte[]Arrays对于double[]int[]long[]具有setAll,但对于其他原语类型则没有。

kxe2p93d

kxe2p93d4#

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

9w11ddsr

9w11ddsr5#

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;

}
uqdfh47h

uqdfh47h6#

从字节[]到字节[]:

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];
    }
2admgd59

2admgd597#

如果有人喜欢流API超过普通循环。

private Byte[] toObjects(byte[] bytes) {
    return IntStream.range(0, bytes.length)
            .mapToObj(i -> bytes[i])
            .toArray(Byte[]::new);
}
pieyvz9o

pieyvz9o8#

退一步,看看更大的图景,你会被困在Byte[]和Byte[]之间,反之亦然,因为Java严格的类型大小写是这样的
列表< Byte>或列表〈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[]的疯狂的复制任务。)
现在你知道了--教别人。

uwopmtnx

uwopmtnx9#

自Java 8:

byte[] bytes = new bytes[byteObject.length];
IntStream.range(0, byteObject.length).forEach(x -> bytes [x] = byteObject[x]);

相关问题