1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title> </title>
</head>
<body>
<p><strong>version "réduire la longueur de la chaîne codée, choisir les valeurs de
remplacement (alphabétiques) et respecter les dimensions du textarea sous Firefox".</strong>
<br />
Par défaut, les caractères choisis sont a et b.
<br />
En fait, la page rappelle surtout qu'on peut exécuter directement une expression codée avec
<strong>eval</strong> (à tester...).
</p>
<div>
<input type="text" size="1" /><input type="text" size="1" /><input type="button" value="clé"
onclick="choix(this.previousSibling.previousSibling.value,this.previousSibling.value)" />
</div>
<div>
<textarea id="zone" rows="10" cols="50"></textarea><input type="button" value="coder"
onclick="code(this.previousSibling.value)" />
</div>
<div>
<textarea id="zone2" rows="10" cols="50"></textarea><input type="button" value="decoder"
onclick="return decode(this.previousSibling.value)" />
</div>
<script type="text/javascript">
// variables expressions rationnelles par défaut; (a et b)
var re1="a";
var re1b=/a/g;
var re2="b";
var re2b=/b/g;
var re3=/[ab]\d*/g;
// définition d'un autre couple de caractères alphabétiques
function choix(n1,n2){
if(/^[a-z]$/i.test(n1) && /^[a-z]$/i.test(n2)){
re1=n1;re1b=new RegExp(n1,"g");
re2=n2;re2b=new RegExp(n2,"g");
re3=new RegExp("["+n1+n2+"]"+"\\d*","g")
}
else{
re1="a";re1b=/a/g;
re2="b";re2b=/b/g;
re3=/[ab]\d*/g;
}
}
var res;// retour du décodage
function code(ch){
if(!ch){
return
}
var t=[];
var m, zero;
for(i=0;i!=ch.length;i++){
var plus="";
// chaque caractère passe en unicode puis en binaire
t.push(ch.charCodeAt(i).toString(2));
// on ajoute des zéros à gauche pour arriver à 8 caractères
zero=8-t[i].length;
for(z=0;z<zero;z++){
plus+="0";
};
t[i]=plus+t[i];
}
// on redécoupe le tableau en groupant les 0 et les 1
var m=t.join("").match(/(0+)|(1+)/g);
for(i=0;i<m.length;i++){
// on remplace le 1er 0 et le 1er 1 de chaque case par la lettre choisie
m[i]=m[i].replace(0,re1);
m[i]=m[i].replace(1,re2);
}
for(i=0;i<m.length;i++){
// on compte le nombre de caractères dans chaque case
// pour obtenir une valeur du type "1 lettre( + 1 chiffre)"
if(m[i].length>1){
var plus=0;
for(j=0;j<m[i].length;j++){
plus++
}
m[i]=m[i].charAt(0)+plus;
}
}
// on ménage un espace dans la chaîne tous les x caractères
// ou x correspond au nombre de colonnes du textarea "codé"
m2=m.join("").replace(/(.{50})/g,"$1 ");
document.getElementById("zone2").value=m2;
}
// alors là... on fait tout pareil dans l'autre sens!
function decode(ch){
if(!ch || ch.indexOf(re1)==-1 || ch.indexOf(re2)==-1){
return
}
ch=ch.replace(/ /g,"").match(re3);
for(i in ch){
if(ch[i].length>1){
var plus="";
for(j=0;j<parseInt(ch[i].substring(1));j++){
plus+=ch[i].charAt(0);
}
ch[i]=plus
}
}
t=ch.join("").replace(re1b,"0").replace(re2b,"1").match(/[0-1]{8}/g);
if(!t){
return
}
for(i in t){
var n=0;
for(j=0;j<t[i].length;j++){
n+=Math.pow(2,7-j)*t[i].charAt(j);
};
t[i]=String.fromCharCode(n);
}
try{
res=eval(t.join(""));
document.getElementById("zone").value= typeof res=="number" ? res :
t.join("")
}
catch(e){
document.getElementById("zone").value=t.join("");
res=alert("Entrez une expression javascript valide.")
};
return res
}
</script>
</body>
</html> |