Decoder - Einige Fehler

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Hallo Community.
Schon seit längerem befasse ich mich mit einem simplen Decoder und Encoder. Darin wird erst nach einer Eingabe gefragt. Diese wird dann decodiert und danach encodiert. Einige Probleme habe ich noch. Das Skript kann keine Leertasten und " oder ' Zeichen verarbeiten. Zudem ist er noch nicht so sauber geschrieben, denke ich.

http://python-forum.de/pastebin.php?mode=view&s=30

Erkennt ihr da den/die Fehler?

Vielen Dank fürs lesen und angucken. :)

VIele Grüße xpilz
BlackJack

@xpilz: Das mag hart klingen aber das ganze Skript ist ziemlicher Murks. Da ist im Grunde jede zweite Zeile ein "WTF!?".
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Hmm :|.. das mag daran liegen das es eins meiner ersten Skripte ist.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Aber "len_check()" musst du uns erklären -- da hab ich ja gestaunt:

Code: Alles auswählen

def len_check(check_string): # wozu wird hier der string übergeben, hier wird doch nur eine Zahl gebraucht?
        """
        Checks a String if its length is over 255 
        """ # gelogen!
        if 33 < len(check_string) < 100:
               return len(check_string)         #mhh, ok
        elif len(check_string) < 33:
                return len(check_string) + 33 # Wieso 33?
        else: #  Ab hier nur noch HÄ?! 
                # (ist das ein Versuch "return len(check_string) % 100" zu schreiben?
                p_cent = (len(check_string)) / 100
                p_val = "%0.f" % p_cent
                p_cent = p_cent - int(p_val)
                p_num = (100 * float(p_cent))
                if list(str(p_num))[0] == "-":
                        p_num = -p_num
                p_num = int("%d" % p_num)
                return p_num
Allgemeine Coder-Weisheit: "wenn du's nicht erklären kannst, ist es zu kompliziert/falsch"

hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Ich versteh zwar den Algorithmus-Code nicht, aber einige Anmerkungen:

Code: Alles auswählen

encoded_string.append(chr(encode_ascii))
Du musst hier keine Listen nutzen, nimm einfach Strings und mache +, dann erübrigt sich auch die `for`-Schleife.

Code: Alles auswählen

if list(str(p_num))[0] == "-":
Du brauchst hier keine Umwandlung zu `list`, man kann auch Strings slicen:

Code: Alles auswählen

if str(p_num)[0]
Im Übrigen gibt es `abs`, dann erübrigt sich das ge-stringe auch:

Code: Alles auswählen

p_num = abs(p_num)

Der nächste Schritt zu verständlichem Code sind sprechende Funktions- und Variablennamen.
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

b.esser-wisser hat geschrieben:Aber "len_check()" musst du uns erklären -- da hab ich ja gestaunt:
Mein Gedanke war den Ascii-Code von jedem eingegebenen Zeichen plus der Länge des Strings zu nehmen. Das Problem wäre dann aber das die Anzahl der Zeichen im String begrenzt wäre Daher ist len_check eine Funktion die überprüfen soll ob der Wert des Strings zwischen 33 und 127 steht. Was erstmal nur testhalber da steht.. Und falls die Länge des Strings über 127 wäre dann nimmt der die Länge teil sie durch 100 zieht die erste Ziffer ab, was in dem Fall nur provisorisch war weil ich nicht wusste wie das sonst geht. Dann nimmt er die Zahl mal 100 und hat dann einen Bereich der zwischen 33 und 127 liegt. Der dann auch wieder enkodierbar wäre. Tut mir leid wenn das ein paar Denkfehler enthält..
und Danke an Dauerbaustelle
Grüße xpilz
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Meinst du dann sowas:

Code: Alles auswählen

LOWER_BOUND, UPPER_BOUND = ord(" ") , 0x7F
"""32 und 127, d.h. alle ASCII-Glyphen"""

def calculate_shift(n):
    return n % (UPPER_BOUND - LOWER_BOUND)

def encode(s):
    shift_distance = calculate_shift(len(s))
    encoded = []
    for c in s:
        tmp = ord(c) + shift_distance
        if tmp > UPPER_BOUND:
            tmp = tmp - UPPER_BOUND + LOWER_BOUND
        encoded.append(chr(tmp))
    return "".join(encoded)

def decode(s):
    shift_distance = calculate_shift(len(s))
    decoded = []
    for c in s:
        tmp = ord(c) - shift_distance
        if tmp < LOWER_BOUND:
            tmp += UPPER_BOUND - LOWER_BOUND
        decoded.append(chr(tmp))
    return "".join(decoded)
hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Das trifft es. Wo ich mir das so durchlese, sehr einfach. Danke für deine Mühe.

Aber zwei Fragen:
Warum kann man LOWER_BOUND und UPPER_BOUND nicht gleich 32 und 127 in dezimal Schreibweise übergeben?
Und wieso ist mein Skript so.. "um die Ecke gedacht" :?. Naja ich bin überzeugt das kann ich ändern.

Grüße xpilz
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

xpilz hat geschrieben:Warum kann man LOWER_BOUND und UPPER_BOUND nicht gleich 32 und 127 in dezimal Schreibweise übergeben?
Natürlich kann man das - es gibt eben viele verschiedene Arten Zahlen zu notieren, so dass ich (nicht besonders erfolgreich, zugegeben) versucht habe eine zu finden, die gut beschreibt wo diese Zahlen herkommen.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

aber 0x7F?!
BlackJack

@Dauerbaustelle: 0x7F erweckt bei mir sofort die Assoziation "Byte bei dem alle bis auf das höchstwertige Bit gesetzt sind". Das passiert wenn man mal zu lange zu nah an der Maschine programmiert hat. ;-)
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Na das is ja komisch ich Google mal alles was ich hier nicht verstanden habe. Danke @all

Gruß
Antworten