ParseInt: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Thomas (Diskussion | Beiträge) (Erste Version des Programms) |
Thomas (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
C-Programm zum Finden des Radix | C-Programm zum Finden des Radix mit dem eine Datei mittels parseInt dekodiert werden kann. | ||
Annahme die höchste Ziffer wird mindestens einmal in der Datei verwendet. | Annahme: die höchste Ziffer wird mindestens einmal in der Datei verwendet. | ||
Version vom 20. Oktober 2012, 21:22 Uhr
C-Programm zum Finden des Radix mit dem eine Datei mittels parseInt dekodiert werden kann.
Annahme: die höchste Ziffer wird mindestens einmal in der Datei verwendet.
/* (c) 2012 by Thomas Arend, 2012/10/20
* Zweck: Bestimmen des Radix für aus einer mit parseInt dekodierbaren Datei
* Annahme: Die höchste Ziffer wurde in der Datei genutz
* Input: parseInt kodiertes File
* Output: wahrscheinlicher Radix zur Funktion parseInt
* Return: 0
* Return: > 0 Anzahl unzulässiger Zeichen 0x0a wird als zulässig angesehen.
* Das Toolkit Blackhole kodiert ein JavaScript
* in den Parametern eines html-Tags derart, dass immer
* zwei Zeichen mittels parseInt in ein neues Zeichen
* umgewandelt werden. Der Radix des Aufrufes von parseInt
* ist im dekodierenden Script obfuskiert.
* Um dieses Script nicht analysieren zu müssen, wird der Radix
* aus dem Input "erraten" und als Parameter übergeben.
*
* Hier ist grundsätzlich nur ein Raten möglich, weil
* die höchste Ziffer nicht im Input enthalten sein muss.
*
* Dass die höchste Ziffer nicht genutz wird, ist in einem größeren
* JavaScript sehr unwahrscheinlich, da der Bereich sinnvoller Zeichen
* zwischen 16 und 36 liegt und damit mehrere Zeichen eine Kodierung
* mit der höchsten Endziffer aufweisen werden.
*
* $Id: $
* $Log:$
*/
#include <stdlib.h>
#include <stdio.h>
#include <string>
using namespace std;
int validziffer (int ziffer ) {
if ('0' <= ziffer && ziffer <= '9')
return 1 ;
else if ('a' <= ziffer && ziffer <= 'z' )
return 1;
else
if ( ziffer == 10 )
return 1;
else
return 0;
}
int maxziffer (int ziffer ) {
if ('0' <= ziffer && ziffer <= '9')
return (ziffer - '0');
else if ('a' <= ziffer && ziffer <= 'z' )
return (ziffer -'a' + 10);
else
return 255;
}
int main ( int argc, char *argv[ ])
{
int zeichen = 0;
int radix = 0;
int genutzt [256] = {0} ;
int dirty = 0;
int isdirty = 0;
// Zählen aller Zeichen
while (( zeichen = getchar()) != EOF ) {
genutzt[zeichen]++;
}
// Suchen des größten genutzten Zeichens
for ( zeichen = 255 ; ( zeichen > 0) && (genutzt[zeichen] == 0); zeichen-- ) {}
// Ausdruck des wahrscheinlichen Radix
radix = maxziffer (zeichen) + 1;
printf ( "%d\n" , radix );
// Prüfen, ob der Input nur aus den zulässigen Zeichen 0-9, a-z
// besteht.
isdirty = 0;
for ( dirty = 1 ; dirty < 256 ; dirty++) {
if ( !validziffer(dirty) && genutzt[dirty] ) {
isdirty++;
}
}
// Ausdrucken des Radix für parseInt
return isdirty;
}