如何将byte []转换为Byte []及其他方法?


77

如何转换byte[]Byte[],也Byte[]byte[],在不使用任何第三方库的情况下?

有没有一种方法可以仅使用标准库来快速完成?


5
10个问题,一个被接受了?不好
Alfabravo

为什么需要/拥有一个Byte[]?似乎不是一个好主意...使用byte[]List<Byte>
沙丘2012年

如果值可以为null,尽管可能不是很有效(即,由于所有对象引用而浪费了存储字节的空间效益),它可能会有用吗?
DNA

但是Byte[]byte[]如果您具有空引用,则不能将a转换为a
Dunes 2012年

@BalusC好的,共7个,有1个。
Alfabravo

Answers:


53

Byteclass是基元的包装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();

4
肯定会推荐Byte.valueOf(b)过来new Byte(b)。如果Byte类没有为字节缓存每个单个值,我会感到惊讶。
沙丘2012年

2
我相信使用它可能会更好Byte.valueOf(byte)。JavaDocs表示,通常应优先于构造方法使用Byte(byte)此方法,因为由于所有字节值都已缓存,因此该方法可能会产生明显更好的空间和时间性能。
Edwin Dalorzo

9
使用自动装箱,您可以轻松完成byteObjects[i++] = b;
Code-Apprentice

4
我会用new Byte[bytes.length];而不是new Byte[10];保持理智。
BalusC 2012年

2
@Juvanis aha,我看到您在for循环中使用了两个“计数器”:一个用于遍历原始字节数组和/或Byte对象数组,另一个用于递增原始字节数组和/或Byte的索引对象数组。对我来说,这是不好的做法。如果此代码由其他人维护,并且有人将计数器“ i”从0修改为另一个值,或者将i ++更改为++ i,则索引不再匹配。我并不是在提倡任何人都应该首先修改代码,但这对于初学者来说是一个常见的陷阱。我的建议是使两个数组的索引保持同步。
user504342 2013年

61

byte []至Byte []:

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

Byte []至byte []:

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

1
为什么这不是最佳答案?是否有性能原因或稍后再回答?
mvorisek

25
因为ArrayUtils不是Java的一部分,而是Apache lib。
mvorisek

我同意@mvorisek,应该认为这是最佳答案。只需添加org.apache.commons.lang3.ArrayUtils
Alex8752

15

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


实际上,这实际上是最好的答案,至少对于对commons-lang添加依赖关系的任何人而言都是如此。
ARRG 2014年

15

Java 8解决方案:

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

不幸的是,您无法执行此操作以将转换Byte[]byte[]ArrayssetAlldouble[]int[]long[],而不是其他的基本类型。


6
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;

}

5

从byte []到Byte []:

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

1

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

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

反过来呢?
ElectRocnic

我认为您无法从Stream获取byte []。流api具有mapToInt(),mapToDouble()和mapToLong()方法,但没有mapToByte()。
mkalmo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.