Hello,
En fait je me suis mal expliqué ... je cherche à décompresser des strings compressées en utilisant l'algo de compression LZW. Pour le moment la compression à lieu en FLASH Action Script 3.
Or lors de la décompression en flash de la même chaine, lorsque j'arrive sur un caractère type ã (ou Ä) j'obtiens avec la fonction var code:int = txt2decode.charCodeAt(i) ;
des codes > 255 c'est même tout l'intéret de l'algo.
Lorsqu'il trouve des séquences identique, il leur attribue une place dans le dico et met dans la chaine l'index de cette séquence dans le dico. par exemple "<c" est inséré dans le dico en position 257 et le caractère dont le code "ascii" correspond à 257 est inséré dans la string compressée.
toute la difficulté est de convertir la fonction AS3 (flash 9) charCodeAt() en java ...
Voici le code compression/decompression en flash as3 :
//conversion en AS3 de l'algorythm de Zeh Fernando version 1.0.0
public class LZW {
static var headerversion:String = "v1.0";
// ===============================================================
// COMPRESSION function -------------------------------------
public static function compress (txt2encode:String): String {
var dico:Array = new Array() ;
for ( var i:int =0 ; i<256 ; i++) dico[ String.fromCharCode (i) ] = i ;
var result:String = "";
var splitStr:Array = txt2encode.split("") ;
var length:int = splitStr.length ;
var nbChar:int = 257 ; // Nombres de caractères courant dans le dictionnaire
var buffer:String = "" ; // initialisation du tampon buffer
for (i=0 ; i <= length ; i++) {
var current = splitStr[i] ;
if ( dico[ buffer + current ] !== undefined ) {
buffer += current ;
} else {
result += String.fromCharCode ( dico[buffer] ) ;
dico [buffer + current] = nbChar++;
buffer = current ;
}
}
return (headerversion+result);
}
// ===============================================================
// FAST DECOMPRESSION function -----------------------------------
public static function decompress (txt2decode:String): String {
txt2decode = txt2decode.substring(headerversion.length);// on supprime le header "v1.0"
var dico:Array = new Array() ;
for ( var i:int =0 ; i<256 ; i++) {
var c:String = String.fromCharCode (i) ;
dico[c] = c ;
}
var splitStr:Array = txt2decode.split("") ;
var length:int = splitStr.length ;
var nbChar:int = 257; // nombre de caractère courant dans le dictionnaire
var buffer:String = "" ; // initialisation du tampon mémoire
var chaine:String = "" ; // chaine temporaire
var result:String = "" ; // chaine retournée à la fin de la décompression
for (i = 0 ; i < length ; i++) {
var current:String = splitStr [i] ;
var code:int = txt2decode.charCodeAt(i) ;
//trace("code "+code+" "+splitStr[i]);
if (buffer == "") {
buffer = current ;
result += current ;
} else {
if ( code <= 256 ) {
result += current ;
chaine = buffer + current ;
dico[nbChar] = chaine ;
nbChar ++ ;
buffer = current ;
} else {
chaine = dico [code] ;
result += chaine ;
dico [nbChar] = buffer + chaine.slice (0, 1);
nbChar ++ ;
buffer = chaine ;
}
}
}
return result;
}
// ===============================================================
}//public class LZW
Pour infos, l'exemple de chaine que je compresse est :
"<call>
<cmd>login</cmd>
<callback>login</callback>
<id_membre>255</id_membre>
<id_site>0</id_site>
<pseudo>toto</pseudo>
</call>"
qui devient quelque chose comme (je suis pas sûr que le debugger + le copier/coller préserve les caractères ...) :
<call>āmd>login</cċĆĈāălbackčďđēĂĄĜĞėĉid_membre>255ēĪĬĮİIJćĩīsitIJ0ķĿŁļĘpseudo>toőēŊŌŎĆģĚ>"""
Merci pour ton aide !!