GZIP décompresser chaîne de bits et de conversion
J'ai un problème dans le code:
private static String compress(String str)
{
String str1 = null;
ByteArrayOutputStream bos = null;
try
{
bos = new ByteArrayOutputStream();
BufferedOutputStream dest = null;
byte b[] = str.getBytes();
GZIPOutputStream gz = new GZIPOutputStream(bos,b.length);
gz.write(b,0,b.length);
bos.close();
gz.close();
}
catch(Exception e) {
System.out.println(e);
e.printStackTrace();
}
byte b1[] = bos.toByteArray();
return new String(b1);
}
private static String deCompress(String str)
{
String s1 = null;
try
{
byte b[] = str.getBytes();
InputStream bais = new ByteArrayInputStream(b);
GZIPInputStream gs = new GZIPInputStream(bais);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int numBytesRead = 0;
byte [] tempBytes = new byte[6000];
try
{
while ((numBytesRead = gs.read(tempBytes, 0, tempBytes.length)) != -1)
{
baos.write(tempBytes, 0, numBytesRead);
}
s1 = new String(baos.toByteArray());
s1= baos.toString();
}
catch(ZipException e)
{
e.printStackTrace();
}
}
catch(Exception e) {
e.printStackTrace();
}
return s1;
}
public String test() throws Exception
{
String str = "teststring";
String cmpr = compress(str);
String dcmpr = deCompress(cmpr);
}
Ce code jeter java.io.IOException: inconnu format (nombre magique ef1f)
GZIPInputStream gs = new GZIPInputStream(bais);
Il s'avère que lors de la conversion d'octets new String (b1)
et la byte b [] = str.getBytes ()
octets sont "gâtés." À la sortie de la ligne, nous avons déjà plus d'octets. Si vous évitez la conversion d'une chaîne et de travailler sur la ligne avec des octets - tout fonctionne. Désolé pour mon anglais.
public String unZip(String zipped) throws DataFormatException, IOException {
byte[] bytes = zipped.getBytes("WINDOWS-1251");
Inflater decompressed = new Inflater();
decompressed.setInput(bytes);
byte[] result = new byte[100];
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
while (decompressed.inflate(result) != 0)
buffer.write(result);
decompressed.end();
return new String(buffer.toByteArray(), charset);
}
Je vais utiliser cette fonction pour décompresser serveur responce. Merci pour l'aide.
OriginalL'auteur Alexandr Erofeev | 2012-06-11
Vous devez vous connecter pour publier un commentaire.
Vous avez deux problèmes:
String(byte[])
constructeur. Que le constructeur est seulement signifiait pour les données codées de texte... ce qui ne l'est pas. Vous devez utiliser base64 pour cela. Il y a un domaine public en base64 de la bibliothèque qui rend cela facile. (Alternativement, ne pas convertir les données compressées de texte à tous - pour retourner un tableau d'octets).Fondamentalement, vous avez besoin de comprendre comment les différents texte et des données binaires sont - lorsque vous voulez convertir entre les deux, vous devriez le faire avec précaution. Si vous voulez représenter "hors texte" données binaires (c'est à dire octets qui ne sont pas le résultat direct de l'encodage de texte) dans une chaîne, vous devez utiliser quelque chose comme base64 ou hex. Si vous voulez encoder une chaîne de caractères en tant que données binaires (par exemple, pour écrire un texte sur le disque), vous devez examiner soigneusement dont l'encodage à utiliser. Si un autre programme va lire vos données, vous devez savoir quel encodage il s'attend - si vous avez le plein contrôle sur vous-même, j'avais l'habitude d'aller pour de l'UTF-8.
En outre, la gestion des exceptions dans votre code est mauvais:
Exception
; attraper plus d'exceptions spécifiquesIl ne sera pas évident quand on est lecture dans Le code de l'encodage vous êtes à utiliser. IMO c'est beaucoup mieux de le dire explicitement. (Et si c'est juste un test, retirez l'exception de la manipulation complètement, et de laisser toutes les méthodes de jeter
IOException
- ça va simplifier le code.)OriginalL'auteur Jon Skeet
Lorsque vous GZIP compresse les données, vous obtenez toujours des données binaires. Ces données ne peuvent pas être converti en chaîne de caractères comme c'est pas un caractère valide les données (dans n'importe quel encodage).
De sorte que votre compresser méthode doit retourner un tableau d'octets et votre décompresser la méthode est un tableau d'octets comme paramètre.
D'ailleurs, je vous recommande d'utiliser un codage explicite lors de la conversion de la chaîne en un tableau d'octets avant la compression et lorsque vous tournez le décompressé des données dans une chaîne de nouveau.
Tout ceci est de l'information, vous devriez avoir inclus dans la question. Je soupçonne que le JSON comprend des données codées en base64... c'est que j'en pensais, j'espère, il serait de représenter des données binaires.
JSON ne peut pas contenir des données binaires. Donc, si la clé est GZIP codée, elle est probablement aussi encodées en Base64 pour transformer les données binaires dans une chaîne JSON peut contenir. Vous devriez sans doute ajouter un JSON de l'échantillon avec la clé à votre question.
OriginalL'auteur Codo
Codo est bon, merci beaucoup de m'éclairer. J'ai essayé de décompresser une chaîne de caractères (conversion à partir de données binaires). Ce que j'ai modifié a été à l'aide de InflaterInputStream directement sur le flux d'entrée retourné par ma connexion http. (Mon application était de la récupération d'un grand JSON de chaînes de caractères)
OriginalL'auteur dionkta