2010-11-24 10 views
3

1 - Von einem Webservice. NET 2008 (vb), ich habe eine Methode, die ein Array von Bytes zurückgibt, das Byte-Array ist eigentlich eine Zeichenfolge "Hola Mundo" ("Hallo Welt" in Englisch) komprimiert mit der Klasse System.IO.Compression GZipStream.Compressed Array Bytes Java von .NET Webservice

2 - Die Methode gibt die Zeichenfolge "Hola Mundo" komprimiert, und das ist, was die Webservice liefert:

<base64Binary> 
H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ir5dlVn6xXo5q/4f0m5DIgoAAAA= 
</base64Binary> 

3 - wenn ich einen Test aus einer Windows-Anwendung von Visual Basic tun. NET zum Ausführen dieser Methode gibt mir diese Zeichenfolge und Unzip mit einer anderen Funktion, die ich habe, bringt es mir die "Hola Mundo" ....

4 - Auf Android (Eclipse) und ich schaffte es, die Anfrage zu stellen und mich zu bringen die vorherige Zeichenfolge ... aber nicht wissen, wie zu dekomprimieren und zeigen Sie mir "Hola Mundo" ...

5 - Ich habe mehrere Codes aus dem Internet versucht, aber keine funktionieren.

Wer weiß etwas darüber? Vielen Dank von jetzt an.

Grüße.

+3

Sie haben ein so komprimiert 10 Zeichenketten bis zu 172 Zeichen. Ordentlich! –

+0

Hallo, Marc Gravell, das ist nur ein einfaches Beispiel, ich benutze tatsächlich um etwa 3 MB Text zu komprimieren. – seba123neo

+0

es war ein bisschen ironisch, ich gestehe, p –

Antwort

3

Wenn Android unterstützt java.util.zip.GZIPInputStream, das ist, was Sie wollen.

Zum Beispiel:

byte[] bytes = getBytesFromWebService(); 
ByteArrayInputStream bais = new ByteArrayInputStream(bytes); 
GZIPInputStream gzip = new GZIPInputStream(bais); 
try { 
    InputStreamReader reader = new InputStreamReader(gzip, "UTF-8"); 
    try { 
    String firstLine = new BufferedReader(reader).readLine(); 
    ... 
    } finally { 
    reader.close(); 
    } 
} finally { 
    gzip.close(); 
} 
+0

Hallo, Ihr Code wirft mir Fehler in der Zeile "GZIPInputStream gzip = new GZIPInputStream (bais);" java.io.IOException: Unbekanntes Format – seba123neo

+0

@ seba123neo: Das deutet darauf hin, dass Sie das Byte-Array nicht korrekt abgerufen haben. Ich schlage vor, Sie überprüfen die Bytes im Debugger. –

+0

Die Zeile Ihres Codes "byte [] bytes = getBytesFromWebService();" Ich habe zu "byte [] bytes = Result geändert.GetBytes();“, wo die Variable "Result" die Zeichenfolge "H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1 + B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee ++ 999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9 + FB8/Ir5dlVn6xXo5q/4f0m5DIgoAAAA =" – seba123neo

1

Ich kann nicht auf Android kommentieren, aber Sie müssen nur:

  • die Basis-64 Reverse
  • umkehren die gzip
  • dekodieren die Zeichenkette (vermutlich als UTF8)

In C#, wäre dies so etwas wie:

string base64 = "H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ir5dlVn6xXo5q/4f0m5DIgoAAAA="; 
byte[] blob = Convert.FromBase64String(base64); 
string orig; 
using (var ms = new MemoryStream(blob)) 
using (var gzip = new GZipStream(ms, CompressionMode.Decompress)) 
using (var reader = new StreamReader(gzip)) 
{ 
    orig = reader.ReadToEnd(); // Hola Mundo 
} 
+0

Ja, ja genau das ist was ich brauche, aber in Android Java Code. – seba123neo

1

Es gibt keine Basis-64-Umwandlung in Android aus dem Paket. Ich benutzte das in der Java Cryptographic Library von Bouncy Castle verfügbare. Bouncy Castle

Sie können sie auch in der ksoap2-android-Bibliothek finden.