Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将字节[]转换为字节[],反之亦然?_Java_Arrays_Byte_Boxing - Fatal编程技术网

Java 如何将字节[]转换为字节[],反之亦然?

Java 如何将字节[]转换为字节[],反之亦然?,java,arrays,byte,boxing,Java,Arrays,Byte,Boxing,在不使用任何第三方库的情况下,如何将字节[]转换为字节[],以及字节[]转换为字节[] 是否有一种方法可以使用标准库快速完成此操作?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[]) fo

在不使用任何第三方库的情况下,如何将
字节[]
转换为
字节[]
,以及
字节[]
转换为
字节[]


是否有一种方法可以使用标准库快速完成此操作?

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();
从字节[]到字节[]:

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

您可以在Apache Commons lang库ArrayUtils类中使用toPrimitive方法, 正如这里所建议的-

Java 8解决方案:

Byte[] toObjects(byte[] bytesPrim) {
    Byte[] bytes = new Byte[bytesPrim.length];
    Arrays.setAll(bytes, n -> bytesPrim[n]);
    return bytes;
}
不幸的是,您无法将
字节[]
转换为
字节[]
<代码>数组对
双[]
int[]
长[]
具有
设置所有
,但不适用于其他基元类型。

字节[]对字节[]:

byte[] bytes = ...;
Byte[] byteObject = ArrayUtils.toObject(bytes);
字节[]到字节[]:

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

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

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


10个问题,一个被接受?不好为什么你需要/有一个
字节[]
?这似乎不是个好主意。。。使用
byte[]
List
。如果值可以为null,则可能会很有用,尽管可能不是很有效(例如,由于所有对象引用,浪费了存储字节的任何空间优势)?但是如果有null引用,则无法将
byte[]
转换为
byte[]
。@BalusC ok,第1页,共7页。没有多大进步!肯定会推荐
Byte.valueOf(b)
over
newbyte(b)
。如果Byte类没有为一个字节缓存每个值,我会感到惊讶。我相信使用
Byte.valueOf(Byte)
可能会更好。JavaDocs说,这种方法通常应该优先于构造函数
字节(Byte)
,因为这种方法可能会产生更好的空间和时间性能,因为所有字节值都是缓存的我会使用
新字节[bytes.length]而不是
新字节[10]
为了保持它的合理性。@Juvanis aha,我看到您在for循环中使用了两个“计数器”:一个用于迭代基本字节数组和/或字节对象数组,另一个用于增加基本字节数组和/或字节对象数组的索引。对我来说,这是一个坏习惯。如果此代码由其他人维护,并且有人将计数器“i”从0修改为另一个值,或者将i++更改为++i,则索引将不再匹配。我不主张任何人首先修改代码,但这是初学者常见的陷阱。我的建议是保持两个数组的索引同步。这实际上是最好的答案,至少对于那些不需要向commons lang添加依赖项的人来说是这样。为什么这不是最好的答案?有什么性能方面的原因吗?或者稍后再回答?因为ArrayUtils不是Java的一部分,而是ApacheLib。我同意@mvorisek,这应该是最好的答案。只需添加org.apache.commons.lang3.ArrayUtils幸运的是,
ArrayUtils
不是标准Java包的一部分。反过来说,我认为您无法从流中获取byte[]。流api有mapToInt()、mapToDouble()和mapToLong()方法,但没有mapToByte()。这对我来说是最好的答案。代码简单,没有第三方库。
byte[] bytes = ...;
Byte[] byteObject = ArrayUtils.toObject(bytes);
Byte[] byteObject = new Byte[0];
byte[] bytes = ArrayUtils.toPrimitive(byteObject);
private Byte[] toObjects(byte[] bytes) {
    return IntStream.range(0, bytes.length)
            .mapToObj(i -> bytes[i])
            .toArray(Byte[]::new);
}