2016-07-12 7 views
0

Ich habe Base64 String. Ich versuche es zu entschlüsseln, dann dekomprimiere es.Kann nicht konvertieren Base64 String und ungzip es richtig

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

-Code, die ich für die Dekomprimierung bin mit:

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

ich sollte diesen String erhalten:

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

Insteam davon, erhalte ich diese Zeichenfolge mit Fragezeichen-Symbole:

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

Wha t ist mein Fehler? Und wie löst man es?

Antwort

0

Ein Problem ist, dass bei der Konvertierung von Bytes in String (intern Unicode) die Codierung nicht gegeben ist. Und für eine Multi-Byte-Codierung wie UTF-8 kann man keine feste Anzahl von Bytes (wie 32) nehmen und dann am Ende eine gültige Sequenz haben.

Sie erlebt den Verlust offenbar eine halbe Folge. Daher ist die Codierung wahrscheinlich 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" ... 

Die oben beseitigt mit Puffergrenze Probleme und gibt die Codierung, so dass der gleiche Code läuft auf verschiedenen Computern.

und Geist:

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

Es ist möglich, dass das Problem hier ist:

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

Sie sind die Standard-Zeichencodierung mit Bytes in einen Java-String zu dekodieren. Wenn die (aktuelle) Standardcodierung der Codierung verwendeten verschieden ist, wenn die ursprünglichen Zeichen Bytes kodieren (vor der Komprimierung, etc.), dann könnte man Bytes erhalten, die nicht richtig entschlüsseln. Der Decoder wird sie dann durch das Ersatzzeichen des Decoders ersetzen; d.h. '\uFFFD' standardmäßig.

Wenn dies das Problem ist, dann ist die Lösung zu finden, was die richtige Zeichencodierung ist und String(byte[], int, int, Charset) verwenden, um die zu erstellen.

+0

I identifiziert, dass es von "UTF-8" codiert wurde. Ihrem Vorschlag folgend, habe ich dieses 'string.append versucht (neuer String (Daten, 0, bytesRead," UTF-8 "));' Aber es hilft nicht. –

+0

Ich schlage vor, dass Sie einen Byte-für-Byte-Vergleich des Bytes vor der Kompression/base64 und base64 nach/Dekompression tun. Und die Längen. Fragen Sie sich auch, ob diese Zeilenschaltung vorhanden sein sollte. –

0

Wenn Sie nur mit Streams arbeiten Sie Codierung Probleme zu vermeiden, sollten diese wenigen Codezeile den Job gut tun

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(); 
     } 
    } 
Verwandte Themen