2017-02-01 4 views
-1

Я пытаюсь преобразовать массив double [] в строку Base64 и наоборот. Я хочу сделать это для хранения очень длинного массива двойных массивов (double [] []) в простой строке и затем вернуться к двойному массиву [] []. Возможно ли это?Как преобразовать двойной массив в строку Base64 и наоборот в Java

Это мой текущий код для проверки преобразования между байтовым массивом и базой. Конечно, не работает:

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

} 

Выход:

@[email protected]?? 
[email protected]? 


3.541909365425625E83 
3.052647263964711E103 
1.1233976318184827E79 
2261634.5098039196 
+0

Если вы просто хотите, чтобы сохранить память, проверьте, чтобы увидеть, если ваши значения могут быть сохранены точно в плотах. Вы сократили бы объем использования памяти вдвое. double = 8 bytes, float = 4 байта – holycatcrusher

+0

, если вы пытаетесь проанализировать свой массив на Base64, я думаю, что есть более эффективные подходы к сериализации данных, например, реализация Serializable –

+1

Ваш 'encodeLocation' не имеет ничего общего с Base64. –

ответ

2

Вы не должны использовать 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 
+0

О, спасибо! Это отлично работает !!!!! –