2017-02-01 3 views
-1
)

이중 [] 배열을 Base64 문자열로 변환하려고합니다. 그 반대의 경우도 마찬가지입니다. 간단한 배열에서 매우 긴 배열의 double 배열 (double [] [])을 저장하고 double [] [] 배열로 돌아가고 싶습니다. 가능합니까?Java에서 double 배열을 Base64 문자열로 변환하는 방법 (

바이트 배열과 Base64 문자열 사이의 변환을 테스트하는 현재 코드입니다. 물론 작동하지 않습니다

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 bytes – holycatcrusher

+0

배열을 Base64로 구문 분석하려고한다면, Serializable을 구현하는 것과 같이 데이터를 직렬화하는 더 나은 접근법이 있다고 생각한다. –

+1

'encodeLocation'은 Base64와 아무 관련이 없다. –

답변

2
당신은 루프 내부에 ByteBuffer.wrap()를 사용해서는 안

, 어떤 Base64로 로직을하지 않는 encodeLocation()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

감사합니다. 그게 완벽하게 작동합니다 !!!!! –