繁体   English   中英

如何在Java中将双精度数组转换为Base64字符串,反之亦然

[英]How to convert double array to Base64 string and vice versa in Java

我正在尝试将double []数组转换为Base64字符串,反之亦然。 我想这样做是为了在一个简单的String中存储一个很长的double数组(double [] []),然后返回到double [] []数组。 可能吗?

这是我当前的代码,用于测试字节数组和Base64 String之间的转换。 当然不行:

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Main {

public static void main(String[] args) {
    double[] testArray = {170.56, 43.78, 674.0};

    String encodedTest = encodeLocation(testArray);
    System.out.println(encodedTest+"\n");

    double[] decodedTest = decodeLocation(encodedTest);
    for(Double d: decodedTest)
        System.out.println(d);
}

private static String encodeLocation(double[] doubleArray){
    byte[] bytes = doubleToByteArray(doubleArray);
    String base64Encoded = new String(bytes, StandardCharsets.UTF_8);
    return base64Encoded;
}

private static double[] decodeLocation(String base64Encoded){
    byte[] bytes = Base64.getEncoder().encode(base64Encoded.getBytes());
    double[] doubleArray = byteToDoubleArray(bytes);
    return doubleArray;
}

private static byte[] doubleToByteArray(double[] doubleArray){

    int times = Double.SIZE / Byte.SIZE;
    byte[] bytes = new byte[doubleArray.length * times];
    for(int i=0;i<doubleArray.length;i++){
        ByteBuffer.wrap(bytes, i*times, times).putDouble(doubleArray[i]);
    }   
    return bytes;
}

private static double[] byteToDoubleArray(byte[] bytes){
    int times = Double.SIZE / Byte.SIZE;
    double[] doubles = new double[bytes.length / times];
    for(int i=0;i<doubles.length;i++){
        doubles[i] = ByteBuffer.wrap(bytes, i*times, times).getDouble();
    }
    return doubles;
}

}

输出:

@eQ??R@E??
=p?@?


3.541909365425625E83
3.052647263964711E103
1.1233976318184827E79
2261634.5098039196

您不应该在循环内使用ByteBuffer.wrap()encodeLocation()不执行任何Base64逻辑, decodeLocation()正在编码,而不是解码,并且您不需要自己进行字符串转换。

简而言之,您的代码有很多问题。 这是修复了所有问题的代码:

import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
import java.util.Base64;

public class Main {
    public static void main(String[] args) {
        double[] testArray = {170.56, 43.78, 674.0};

        String encodedTest = encodeLocation(testArray);
        System.out.println(encodedTest+"\n");

        double[] decodedTest = decodeLocation(encodedTest);
        for (double d : decodedTest)
            System.out.println(d);
    }
    private static String encodeLocation(double[] doubleArray) {
        return Base64.getEncoder().encodeToString(doubleToByteArray(doubleArray));
    }
    private static double[] decodeLocation(String base64Encoded) {
        return byteToDoubleArray(Base64.getDecoder().decode(base64Encoded));
    }
    private static byte[] doubleToByteArray(double[] doubleArray) {
        ByteBuffer buf = ByteBuffer.allocate(Double.SIZE / Byte.SIZE * doubleArray.length);
        buf.asDoubleBuffer().put(doubleArray);
        return buf.array();
    }
    private static double[] byteToDoubleArray(byte[] bytes) {
        DoubleBuffer buf = ByteBuffer.wrap(bytes).asDoubleBuffer();
        double[] doubleArray = new double[buf.limit()];
        buf.get(doubleArray);
        return doubleArray;
    }
}

输出量

QGVR64UeuFJARePXCj1wpECFEAAAAAAA

170.56
43.78
674.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM