J'ai besoin d'un exemple pour compresser une chaîne de caractères en utilisant GZip dans Android. Je veux envoyer une chaîne comme "hello" à la méthode et obtenir la chaîne compressée suivante :
BQAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyLmeVlW/w+GphA2BQAAAA==
Alors je dois le décompresser. Quelqu'un peut-il me donner un exemple et compléter les méthodes suivantes ?
private String compressString(String input) {
//...
}
private String decompressString(String input) {
//...
}
Merci,
mise à jour
Selon réponse du sceptre J'ai maintenant les 4 méthodes suivantes. Les méthodes de compression et de décompression Android et .net. Ces méthodes sont compatibles entre elles sauf dans un cas. Je veux dire qu'elles sont compatibles dans les 3 premiers états mais incompatibles dans le 4ème état :
- état 1) Android.compress <-> Android.decompress : ( OK )
- état 2) Net.compress <-> Net.decompress : ( OK )
- état 3) Net.compress -> Android.decompress : ( OK )
- état 4) Android.compress -> .Net.decompress : ( PAS OK )
Quelqu'un peut-il le résoudre ?
Méthodes Android :
public static String compress(String str) throws IOException {
byte[] blockcopy = ByteBuffer
.allocate(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(str.length())
.array();
ByteArrayOutputStream os = new ByteArrayOutputStream(str.length());
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write(str.getBytes());
gos.close();
os.close();
byte[] compressed = new byte[4 + os.toByteArray().length];
System.arraycopy(blockcopy, 0, compressed, 0, 4);
System.arraycopy(os.toByteArray(), 0, compressed, 4,
os.toByteArray().length);
return Base64.encode(compressed);
}
public static String decompress(String zipText) throws IOException {
byte[] compressed = Base64.decode(zipText);
if (compressed.length > 4)
{
GZIPInputStream gzipInputStream = new GZIPInputStream(
new ByteArrayInputStream(compressed, 4,
compressed.length - 4));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int value = 0; value != -1;) {
value = gzipInputStream.read();
if (value != -1) {
baos.write(value);
}
}
gzipInputStream.close();
baos.close();
String sReturn = new String(baos.toByteArray(), "UTF-8");
return sReturn;
}
else
{
return "";
}
}
Méthodes .Net :
public static string compress(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
{
zip.Write(buffer, 0, buffer.Length);
}
ms.Position = 0;
MemoryStream outStream = new MemoryStream();
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);
byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);
}
public static string decompress(string compressedText)
{
byte[] gzBuffer = Convert.FromBase64String(compressedText);
using (MemoryStream ms = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
{
zip.Read(buffer, 0, buffer.Length);
}
return Encoding.UTF8.GetString(buffer);
}
}
0 votes
Résultat de
compressString
ne peut êtreString
il doit êtrebytes[]
. De même, l'entrée pourdecompressString
ne peut êtreString
il doit êtrebytes[]
aussi.0 votes
Que voulez-vous dire ? inversement ' ? Compresser un
GZIPOutputStream
en utilisant unString
? ;-)0 votes
Ma méthode .Net crée la grande chaîne mentionnée qui n'est pas la même que le résultat de la méthode de compression dans Android. J'ai mis à jour ma question et inséré les méthodes .Net Compress et Decompress. Quelqu'un peut-il modifier ces méthodes pour créer les mêmes chaînes compressées ?
0 votes
Il existe de nombreuses chaînes "compressées" possibles et valides qui se décompresseront en la chaîne "Hello". Si deux compresseurs différents produisent des résultats différents, ce n'est pas grave, tant qu'ils décompressent correctement sur toutes les sorties. Quelle sortie obtenez-vous du décompresseur pour la situation NOT OK ?
0 votes
Lorsque j'envoie le résultat de la compression Android à la méthode de décompression .Net, j'obtiens une exception
0 votes
Veuillez fournir les 20 premiers octets de la compression Android et net, soit en hexagone, soit en base64. Il est possible qu'Android decompress puisse travailler avec deux formats de compression différents automatiquement, mais que net ne puisse en gérer qu'un seul, où les compressions Android et net produisent les deux formats différents.
0 votes
@breceivemail - votre problème est probablement lié à la version de .NET. Voir ma version mise à jour des classes C# et Java qui devraient fonctionner à 100%. Il contient également un encodage Base64 pour ceux qui ont besoin de transporter du JSON : stackoverflow.com/a/36126217/237858