如何将字节数组转换为双数组?

时间:2013-08-21 12:03:24

标签: java

如何将此字节数组转换为双数组。

byte[] byteArray = {1,0,0,1,0};

我喜欢将此转换为不使用循环,因为此字节数组有大量元素。

请帮帮我

4 个答案:

答案 0 :(得分:4)

可能的“无环”解决方案将使用System.arraycopyArrays.copyOf,但在这些解决方案中,您无法避免将byte[]转换为double[]。根据{{​​3}}:

,问题在于这种投射是不可能的
Given a compile-time reference type S (source) and a compile-time reference 
type T (target), a casting conversion exists from S to T if no compile-time 
errors occur due to the following rules.
[...]
If S is an array type SC[], that is, an array of components of type SC: 
[...] 
  - If T is an array type TC[], that is, an array of components of type TC, 
    then a compile-time error occurs unless one of the following is true: 
    - TC and SC are the same primitive type. 
    - [...]

使用循环。另请参阅specification

答案 1 :(得分:1)

好的,有些操作java不提供单行操作,因为实际上并不需要它。

让我们考虑一下。我将你的字节数组转换为单行的字符串,没有循环。

    byte[] byteArray = {1,0,0,1,0};          
    String str=Arrays.toString(byteArray);

但是,

toString()内部发生了很多事情。

    public static String toString(byte[] a) {
    if (a == null)
        return "null";
    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(a[i]);
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}

现在你可以看到,实际上这里有一个loop。同样,如果您能够找到将byte[]转换为double[]的单行方式,那么您也会做同样的事情。(带循环)。

您可以按照以下方式执行此操作

 byte[] byteArray = {1,0,0,1,0};
 double[] arr=toDoubleArray(byteArray);

但是,你也需要以下方法。

public static double[] toDoubleArray(byte[] byteArr){
    double[] arr=new double[byteArr.length];
    for (int i=0;i<arr.length;i++){
        arr[i]=byteArr[i];
    }
    return arr;
}

答案 2 :(得分:1)

如果你想避免循环,迭代可以实现为递归:

public static double[] convert(byte[] in, int idx) {
    double[] ret;
    if (idx == 0) {
        ret = new double[in.length];
        ret[0] = (double)in[0];
    }
    else {
        ret = convert(in, idx-1);
        ret[idx] = (double)in[idx];
    }
    return ret;
}

public static void main(String[] args) {
    byte[] byteArray = {1,0,0,1,0};        
    double[] converted = convert(byteArray, byteArray.length-1);
    for (int i=0;i<byteArray.length;i++) {
        System.out.println(Byte.toString(byteArray[i])+ " converted to double "+converted[i]);
    }
}

输出:

1 converted to double 1.0
0 converted to double 0.0
0 converted to double 0.0
1 converted to double 1.0
0 converted to double 0.0

然而:

  • 从你的问题中不清楚你想要实现什么,但是当从字节转换为双倍时,必须知道该字节数组endianess
  • 我不建议使用递归迭代替换循环,因为它有更多的开销
  • 如果你想将字节数组转换为无法完成的双数组(参见kol的回答)

答案 3 :(得分:-3)

我假设您正在寻找Java答案......

这将在一行中执行您想要的操作,但它仍然在后台循环。据我所知,没有一种方法可以在没有某种程度的循环的情况下投射数组

ByteBuffer.wrap(bytes).asDoubleBuffer().array();