decodeer codetaal

Status
Niet open voor verdere reacties.

punkrock

Gebruiker
Lid geworden
28 feb 2007
Berichten
29
Hallo !

Ik heb een vraagje.
Ik zou een javascipt willn makn om een code de decoderen
de codetaal is vb.: a=1. b=2. c=3. ...
Dus ik zou in een tekstvak invoeren:
' 8.1.12.12.15. '
En als ik dan op een knop 'decodeer' klik moet er in een ander tekstvak komen:
' hallo '

Alvast bdankt vr jullie hulp
Grz.
 
Ik zou het volgende doen:
1) de inhoud van het veld in een variabele proppen
2) dit:
PHP:
jouwVariabele = jouwVariabele.split('a').join('1');
jouwVariabele = jouwVariabele.split('b').join('2');
jouwVariabele = jouwVariabele.split('c').join('3');
(enz)
3) de variabele naar het veld schrijven

Hoop dat je hier iets aan hebt ;)
 
Met respect naar de code van bn2vs denk ik dat het iets sneller kan.

Allereerst hak je de code in kleine stukjes:
Code:
	jouwVar = "0.1.2.3.4.5";
	splitted = jouwVar.split(".")

De in mijn ogen meest logische optie zou zijn om de code vervolgens in een Array te pompen:
Code:
	decode = ["a", "b", "c", "d", "e", "f"];
	for(i in splitted) document.write(decode[splitted[i]]);

Maar omdat je hier te maken hebt met enkele characters, kun je ook de volgende optie gebruiken:
Code:
	decode = "abcdefghijklmnopqrstuvwxyz";
	for(i in splitted) document.write(decode[splitted[i]]);

Beide geeft zelfde resultaat. De laatste is denk ik een fractie sneller en is in ieder geval compacter qua code. De complete code zou dus:

Code:
	jouwVar = "0.1.2.3.4.5";
	splitted = jouwVar.split(".");
	decode = "abcdefghijklmnopqrstuvwxyz";
	for(i in splitted) document.write(decode[splitted[i]]);

Wout
 
Laatst bewerkt:
Dat is idd beter ja, ik ben dan ook niet zo ervaren met JS he...
 
Hmm, Ik ben lang niet zo sterk in JS maar als ik het toch een beetje begrijp zo ik zeggen dat dit de code is:
Code:
<script>
inVar = prompt("Voer in.","8*1*12*12*15");
splitted = inVar.split("*");
decode = "abcdefghijklmnopqrstuvwxyz";
for(i in splitted)
document.write(decode[splitted[i]]);
</script>
Maar dat werkt niet..
De output is 'undefinedundefinedundefinedundefinedundefined'
Heb ik iets erg belangrijk over het hoofd gezien ? Heb ik wat vergeten ? Of lijkt het erop dat ik er helemaal niks van begrijp :p
Kan iemand me verder helpen door eventueel de volledige werkende code te geven ?
tnx.
 
Tralalala, mijn fout :o. IE7 is niet zo lief om [] te gebruiken om de positie in een tekenreeks weer te geven. Maar niet getreurd! There's always a Plan B. Gewoon even een Array maken van decode, en IE7 is ook weer blij:

decode = "abcdefghijklmnopqrstuvwxyz".split("");

HTML:
<script>
inVar = prompt("Voer in.","8*1*12*12*15");
splitted = inVar.split("*");
decode = "abcdefghijklmnopqrstuvwxyz".split("");
for(i in splitted)
document.write(decode[splitted[i]]);
</script>

Wout
 
Ok tlukt..
Heel erg bedankt!
Alleen is bij dat scriptje de code wel 0=a... ipv 1=a...
maar geen probleem. Dat is ook goed & anders ken ik daar wel zelf een oplossing voor vinden.
Dankuwel vor de hulp !
Sallut
 
Alln nog een bijvraagj ..
Het zou handig zijn als ik ook nog een scriptj had om de code te coderen ipv te decoderen. M.a.w. Net het omgekeerde
Ik zou beginnen met dit:
Code:
<script>
inVar = prompt("Voer in.","abc");
splitted = inVar.split("");
decode = ("...").split("*");
for(i in splitted)
document.write(decode[splitted[i]]);
</script>
Maar verder weet ik niet. Ik vermoed ook dat dat scriptje ook wel iets langer zal zijn aangezien het niet gwn 1 2 3 .. is.
Dankuwel!
 
Alleen is bij dat scriptje de code wel 0=a... ipv 1=a...
Code:
decode = ' abcdefghijklmnopqrstuvwxyz'.split(/\D/);
De spatie voor het alfabet zorgt voor 1 = a, 2 = b enz..

Door .split(/\D/) worden alle niet-cijfers als scheidingsteken gebruikt. :)


Vr.Gr. Egel
 
Beste Punkrock,

In principe kan wat jij wilt op de zelfde methode, alleen draai je het dan om. Je zou het Array om kunnen draaien:

Je had eerst:
decode = "abc".split();
Wat gelijk is aan:
decode = Array("a", "b", "c");
Wat gelijk is aan:
decode = Array();
decode[0] = "a";
decode[1] = "b";
decode[2] = "c";


Nouja, dat laatste (omslachtige) draaien we om:
decode = Array();
decode["a"] = 0;
decode["b"] = 1;
decode["c"] = 2;
.

Leuk, maar veel vervelend typwerk. Op te lossen door een lus aan te leggen:
HTML:
<script type="text/javascript">
  // reeks 1 (voor getal naar letter)
  decode = " abcdefghijklmnopqrstuvwxyz".split();
  
  // reek 2 (voor letter naar getal)
  decode2 = Array();  // Nieuw array maken
  counter = 0; // Een tellertje maken om te weten waar we zijn
  for(i in decode){ // Alle characters uit getal naar letter langs gaan
    decode2[i] = counter; // decode2["a"] = 1;
    counter++ // Countertje ééntje verhogen
  }
</script>

Leuk script. Bestudeer het even goed, omdat je veel over Array leert. Opzich is bovenstaand de meest logische manier. Máár ik blijf Wout en wil natuurlijk de kleinste oplossing. De computer kent zelf ook een codeer systeem. Je hebt verschillende coderingen maar de meest bekende is ASCII. Ieder character heeft een code. Zo heeft de hoofdletter A de code 65, de hoofdletter B de code 66. Complete tabel is te vinden op: http://www.ascii.nl/. Maargoed, de code:

HTML:
<script type="text/javascript">
  varInput = prompt("Vul in", "abc").split(""); // Doet de split maar direct

  // van letter naar code
  cijferCode = "";
  for(i in varInput) cijferCode += (varInput[i].charCodeAt(0)-96).toString() + "*";
    /* CharCodeAt(index) vraagt de ASCII code van een character op de plaats
	 van het variabel [i]index[/i] op. In ons geval is [i]i[/i] één character 
	 lang, dus kijken we op positie 0. Voor de letter [b]a[/b] komt er nu 97
	  uit en de opvolgende letters 98, 99 enz. We willen voor [b]a[/b] graag
	   1 hebben, dus trekken we er 96 vanaf.*/

  // van code naar letter
  letterCode = "";
  cijferCodeSplit = cijferCode.split("*");
  for(i in cijferCodeSplit)  letterCode += String.fromCharCode(parseInt(cijferCodeSplit[i])+96);
	  /* Sting.fromCharCode doet tegenovergestelde van charCodeAt. 
	  Verder hebt je parseInt nodig, omdat de cijfercode als een 
	  string is opgeslagen en dan niet kan optellen.
	  string: "2" + 96 = "296"
	  integer: 2 + 96 = 98*/
  document.write(cijferCode + "-" + letterCode);
</script>


De code kan nog kleiner, maar dan is het niet echt goed uit te leggen. Daarnaast genereer je nu telkens een * aan het einde. Dat is zo op te lossen via een reguliere expressie. (of een if vraagje). Maar mijn klokje zegt dat het half 2 geweest is dus tijds voor een dutje.

Ik hoop dat je bovenstaande codes allemaal begrijpt en dat je ze een beetje studeert. Voor je het weet ben je een javascript koning. Voor reference: www.w3cschools.com. Die leggen alles prima uit, en wat daar staat is "altijd" waar. Mocht je iets niet snappen aan bovenstaande dan zien we je vraag vanzelf verschijnen :-p.

Wout
 
Code:
<script type="text/javascript">
 var c = ' abcdefghijklmnopqrstuvwxyz'.split('');
 for (i in c) c[c[i]] = i;
 var p = prompt('Code?','').toLowerCase().replace(/([a-z])/g,'$1*').split(/[^\da-z]/);
 for (i in p) document.writeln(c[p[i]]);
</script>
;)
 
@Egel: Dat is inderdaad de beste manier als je de lus gebruikt. Beetje dom van mij om een counter toe te voegen, haha :rolleyes:. Die toLowerCase() is trouwens een goeie, al zou je natuurlijk kunnen zeggen dat een code hoofdlettergevoelig zou moeten zijn.

Het *-tje teveel zal zorgen voor een undefined aan het einde van de code reeks. Niet zo'n heel groot probleem natuurlijk. Ik denk dat de Array.pop() functie hier het meest toepasselijk is. Je krijgt dan:
Code:
 var c = ' abcdefghijklmnopqrstuvwxyz'.split('');
 for (i in c) c[c[i]] = i;
 var p = prompt('Code?','').toLowerCase().replace(/([a-z])/g,'$1*').split(/[^\da-z]/);
 p.pop();
 for (i in p) document.writeln(c[p[i]]);

Je gebruikt hierbij echter twee lussen, wat meer tijd kost dan de functie CharCodeAt(). Niet dat het significant is, maar toch :-p. (met de lowerCase() togevoegd) :
Code:
  varInput = prompt("Vul in", "abc").toLowerCase().split("");
  for(i in varInput) document.writeln(varInput[i].charCodeAt(0)-96);

Maar laat duidelijk zijn dat er eigenlijk geen verschil zit in beide methoden. Het is dus maar wat je makkelijk vind.

Wout
 
Laatst bewerkt:
@w.sickman, er kon idd een undefined in voorkomen. :o Raar is ook dat Ie het anders verwerkte dan Fx en Opera. :confused:

De twee lussen zijn omdat het tegelijkertijd codeerd en decodeert, afhankelijk van de input. :) (Ongeveer zoals bij Rot13.)

Deze code is verbeterd:
Code:
<script type="text/javascript">
 var c = ' abcdefghijklmnopqrstuvwxyz'.split('');
 for (i = 1; i < 27; i++) c[c[i]] = i;
 var p = prompt('Code?','').toLowerCase().match(/[a-z]|\d+/g);
 for (i = 0; i < p.length; i++) document.writeln(c[p[i]]);
</script>
Als je hallo 8 1 12 12 15 invult komt er 8 1 12 12 15 h a l l o uit. :cool: ;)


Vr.Gr. Egel.
 
Laatst bewerkt:
@Egel: de vraag was natuurlijk van Cijfer naar Letter, maar de twee vragen zo gecombineerd naar één scriptje is natuurlijk nog mooier. Ik vind de CharCodeAt veel leuker, maar in dit geval is Rot13 inderdaad toepasselijker. :D. Al kun je natuurlijk ook gaan kijken naar Rot47 (ASCII:p variant).

Wat trouwens wel geinig is van Rot13, is dat het belachelijk veel gebruikt is. Op de Wiki stond dat het met name voor online forum ed gebruikt werkt, en gelukkig leggen zij de nadruk op dat het onveilig is. Daarentegen hebben enkele banken in Nederland vroeger een Rot13 methode gebruikt om mensen te helpen met hun pincode. Je kon bij de bank een woord opgeven (bijv. Wout) en vervolgens kon je dan bij de pinautomaat een draaischijf pakken waar je iedere letter van Wout langs ging. De W was dan een 9 de o een 6. Uiteindelijk schoof je dus volgens de Rot13 methode je code in elkaar. Ik hou het maar bij mn pincode in mijn hoofd opslaan... ;).

Wout

ps. De vraag is volgens mij al een heel erg lang tijdje beantwoord :p, kan punkrock het statusje even aanpassen.
 
Ja idd Wout. Sorry ik had het nog niet bekeken. Ok hartelijk bedankt ik Kan er aan uit en het is me gelukt om m'n coder en decoder te maken. De code zelf heb ik wel een betje aangepast. Dit zijn mijn scriptjes:

Coder:
Code:
<script>
    inVar = prompt("Vul tekst in:","Hallo!").split("");
    cijferCode = "";
    for(i in inVar) cijferCode += (inVar[i].charCodeAt(0)-32).toString() + " ";
    letterCode = "";
    cijferCodeSplit = cijferCode.split(" ");
    for(i in cijferCodeSplit) letterCode += String.fromCharCode(parseInt(cijferCodeSplit[i])+32);
 document.write("<tt># Code:<br> .. " + cijferCode + "<br># Tekst:<br> .. " + letterCode + "</tt>");
</script>
Decoder:
Code:
<script>
    inVar = prompt("Vul code in:","40 65 76 76 79 1");
    splitted = inVar.split(" ");
    decode = " !'#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ ]^_`abcdefghijklmnopqrstuvwxyz{|}=~".split("");
    letterCode = "";
    for(i in splitted) letterCode += decode[splitted[i]]
 document.write("<tt># Code:<br> .. " + inVar + "<br># Tekst:<br> .. " + letterCode + "</tt>");
</script>
Het enige probleem is dat firefox af en toe eens raar doet met 1 van de scriptjes. Maar das geen probleem. Zolang het werkt.
Allen hartelijk bedankt! & dan kan ik de vraag nu als beantwoord markeren.
Daag
 
De Code van Engel is idd ook erg handig. Ik sla ze even op op men pc. Dankuwel! 2 in 1 daar was ik naar op zoek. Alleen komt het nu niet volledig met de code meer overeen. Maar das apsoluut geen probleem. De code is niet belangrijk. Het is gwnde bedoeling dat de tekst onleesbaar word overgebracht en door een ander kan worden vertaald naar een leesbare tekst.
Ontzettend bedankt voor jullie bereidwillige medewerking :D :D
Salut
 
Ik heb nog 1 opmerking maar dar is wss niks op te vinden: Hele lange teksten vertaalt hij niet helemaal.. Dat doe ik dan maar gwn in deeltjes
Daag
 
We lieten ons even meeslepen op zoek naar het kleinste script. :D ;)

Dit is met invulvakjes en ascii ± 32:
Code:
<script type="text/javascript">
 function encode() {
  var text = document.f.text.value, code = new Array();
  for (i = 0; i < text.length; i++) code[i] = text.charCodeAt(i) - 32;
  document.f.code.value = code.join(' ');
  };
 function decode() {
  var code = document.f.code.value.match(/-?\d+/g), text = new Array();
  for (i = 0; i < code.length; i++) text[i] = String.fromCharCode(parseInt(code[i]) + 32);
  document.f.text.value = text.join('');
  };
</script>

<nobr>
 <form name="f">
  <textarea name="text" cols="32" rows="32" onkeyup="encode()" onchange="encode()">Tekst:</textarea>
  <textarea name="code" cols="64" rows="32" onkeyup="decode()" onchange="decode()">52 69 75 83 84 26</textarea>
 </form>
</nobr>
Links staat tekst en rechts code, als je in één van de vakjes typt wordt het andere vakje aangepast. :)

Je kunt ook in een vakje plakken (daarna even onder de vakjes klikken). Deze pakt ook lange teksten, regeleindes worden vertaalt naar -19 -22.


Vr.Gr. Egel.
 
Laatst bewerkt:
Jah ! da is het !
Da was wa ik dus zocht
geweldig ! Sorry voor't late antwoord maar ik had ondertussn wel al heel wat andere zakn aan mn hoofd & toen was de sgool dr ook .. wtv Ik bn blij da ik heb wa ik wou
This wel duidelijk gemaakt door iemand di er wel èrg veel vn kent !
danku !
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan