2016-07-12 1 views
0

Base64 문자열이 있습니다. 해독하려고 시도하고 압축을 푸십시오. 내가 압축 해제에 사용하고Base64 문자열을 변환 할 수없고 올바르게 풀릴 수 없습니다.

String textToDecode = "H4sIAAAAAAAAAAEgAN//0JTQtdGC0LDQu9C40LfQuNGA0L7QstCw0L3QvdGL0LmRCuyiIAAAAA==\n"; 
byte[] data = Base64.decode(textToDecode, Base64.DEFAULT); 
String result = GzipUtil.decompress(data); 

코드 :

public static String decompress(byte[] compressed) throws IOException { 
    final int BUFFER_SIZE = 32; 
    ByteArrayInputStream is = new ByteArrayInputStream(compressed); 
    GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE); 
    StringBuilder string = new StringBuilder(); 
    byte[] data = new byte[BUFFER_SIZE]; 
    int bytesRead; 
    while ((bytesRead = gis.read(data)) != -1) { 
     string.append(new String(data, 0, bytesRead)); 
    } 
    gis.close(); 
    is.close(); 
    return string.toString(); 
} 

내가이 String 얻어야한다 : 그것의

Детализированный 

Insteam을, 나는 물음표 기호이 문자열을 얻고있다 :

화 내 실수 야? 어떻게 해결할 수 있을까요?

답변

0

한 가지 문제점은 바이트에서 문자열 (내부 유니 코드) 으로 변환 할 때 인코딩이 제공되지 않는다는 것입니다. 그리고 UTF-8과 같은 멀티 바이트 인코딩의 경우 고정 바이트 수 (예 : 32)를 취할 수 없으며 마지막에는 유효한 시퀀스가 ​​있습니다.

분명히 절반 시퀀스의 손실이 발생했습니다. 따라서 인코딩은 아마 UTF-8입니다.

final int BUFFER_SIZE = 32; 
ByteArrayInputStream is = new ByteArrayInputStream(compressed); 
GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] data = new byte[BUFFER_SIZE]; 
int bytesRead; 
while ((bytesRead = gis.read(data)) != -1) { 
    baos.write(data, 0, bytesRead); 
} 
gis.close(); 
return baos.toString("UTF-8"); // Or "Windows-1251" ... 

위의 코드는 버퍼 경계 문제를 해결하고 인코딩을 지정하므로 다른 컴퓨터에서 동일한 코드가 실행됩니다.

그리고 마음 :

  • new String(bytes, encoding)
  • string.getBytes(encoding)
0

문제가 여기 가능성이있다 : 당신은 자바 문자열로 바이트를 디코딩하는 기본 문자 인코딩을 사용하는

string.append(new String(data, 0, bytesRead)) 

. (현재의) 기본 인코딩이 원본 문자를 바이트로 인코딩 할 때 (압축 이전 등) 인코딩과 다른 경우 제대로 디코딩하지 않는 바이트를 얻을 수 있습니다. 그러면 디코더는 디코더의 대체 문자로 대체합니다. 즉, 기본값은 '\uFFFD'입니다.

이것이 문제가되는 경우 해결 방법은 올바른 문자 인코딩이 무엇인지 알아 내고 String(byte[], int, int, Charset)을 사용하여 String을 만드는 것입니다.

+0

"UTF-8"로 인코딩되었음을 확인했습니다. 당신의 제안에 따라, 나는이'string.append (new String (data, 0, bytesRead, "UTF-8"));를 시도했다. –

+0

압축/base64 전과 base64/압축 해제 후 바이트의 바이트 별 비교를 제안합니다. 길이도. 또한 개행이 있어야하는지 스스로에게 물어보십시오. –

0

당신이 인코딩 문제를 피할 수 스트림에서만 작동하는 경우는,이 ​​코드 몇 줄은 작업을 잘해야

public static String decompress(byte[] compressed) throws IOException { 
     try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { 
      try (GZIPInputStream gis = new GZIPInputStream(
        new ByteArrayInputStream(compressed))) { 
       org.apache.commons.compress.utils.IOUtils.copy(gis, bos); 
      } 
      return bos.toString(); 
     } 
    }