如何将byte []转换为Byte [],反之亦然?

use*_*958 63 java arrays byte boxing

在不使用任何第三方库的情况下,如何将byte []转换为Byte [],并将Byte []转换为byte []?有没有办法快速使用标准库?

小智 46

byte []到Byte []:

byte[] bytes = ...;
Byte[] byteObject = ArrayUtils.toObject(bytes);
Run Code Online (Sandbox Code Playgroud)

字节[]到字节[]:

Byte[] byteObject = new Byte[0];
byte[] bytes = ArrayUtils.toPrimitive(byteObject);
Run Code Online (Sandbox Code Playgroud)

  • 因为ArrayUtils不是Java的一部分,而是Apache lib. (17认同)

Juv*_*nis 43

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();
Run Code Online (Sandbox Code Playgroud)

  • 使用自动装箱,你可以简单地做`byteObjects [i ++] = b;` (9认同)
  • 我会使用`new Byte [bytes.length];`而不是`new Byte [10];`来保持它的合理性. (4认同)
  • 肯定会推荐`Byte.valueOf(b)`超过`new Byte(b)`.如果Byte类没有缓存一个字节的每个值,我会感到惊讶. (2认同)
  • 我相信使用`Byte.valueOf(byte)`可能会更好.JavaDocs说这个方法通常应优先于构造函数`Byte(byte)`使用,因为这个方法可能会产生明显更好的空间和时间性能,因为所有字节值都被缓存. (2认同)
  • @Juvanis 啊哈,我看到您在 for 循环中使用了两个“计数器”:一个用于迭代原始字节数组和/或 Byte 对象数组,另一个用于增加原始字节数组和/或 Byte 的索引对象数组。对我来说,这是不好的做法。如果此代码由其他人维护,并且有人将计数器“i”从 0 修改为另一个值,或者将 i++ 更改为 ++i,则索引不再匹配。我不提倡任何人首先修改代码,但这是初学者的常见陷阱。我的建议使两个数组的索引保持同步。 (2认同)

Gia*_*nis 14

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


ajb*_*ajb 14

Java 8解决方案:

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

不幸的是,你不能这样做转换Byte[]byte[]. ArrayssetAlldouble[],int[]long[],而不是其他的基本类型.


jac*_*des 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;

}
Run Code Online (Sandbox Code Playgroud)

逆:

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

}
Run Code Online (Sandbox Code Playgroud)


DNA*_*DNA 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]);
    }
Run Code Online (Sandbox Code Playgroud)

从Byte []到byte [](使用我们先前定义的B):

    byte[] b2 = new byte[B.length];
    for (int i = 0; i < B.length; i++)
    {
        b2[i] = B[i];
    }
Run Code Online (Sandbox Code Playgroud)