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
Decoder - Einige Fehler
- xpilz
- User
- Beiträge: 76
- Registriert: Sonntag 11. April 2010, 12:46
- Wohnort: Deutschland
- Kontaktdaten:
Mein Python-Blog.
@xpilz: Das mag hart klingen aber das ganze Skript ist ziemlicher Murks. Da ist im Grunde jede zweite Zeile ein "WTF!?".
- 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.
Mein Python-Blog.
- 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:
Allgemeine Coder-Weisheit: "wenn du's nicht erklären kannst, ist es zu kompliziert/falsch"
hth, Jörg
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
hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Ich versteh zwar den Algorithmus-Code nicht, aber einige Anmerkungen:
Du musst hier keine Listen nutzen, nimm einfach Strings und mache +, dann erübrigt sich auch die `for`-Schleife.
Du brauchst hier keine Umwandlung zu `list`, man kann auch Strings slicen:
Im Übrigen gibt es `abs`, dann erübrigt sich das ge-stringe auch:
Der nächste Schritt zu verständlichem Code sind sprechende Funktions- und Variablennamen.
Code: Alles auswählen
encoded_string.append(chr(encode_ascii))
Code: Alles auswählen
if list(str(p_num))[0] == "-":
Code: Alles auswählen
if str(p_num)[0]
Code: Alles auswählen
p_num = abs(p_num)
Der nächste Schritt zu verständlichem Code sind sprechende Funktions- und Variablennamen.
- xpilz
- User
- Beiträge: 76
- Registriert: Sonntag 11. April 2010, 12:46
- Wohnort: Deutschland
- Kontaktdaten:
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..b.esser-wisser hat geschrieben:Aber "len_check()" musst du uns erklären -- da hab ich ja gestaunt:
und Danke an Dauerbaustelle
Grüße xpilz
Mein Python-Blog.
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
Meinst du dann sowas:
hth, Jörg
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)
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
- 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
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
Mein Python-Blog.
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
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.xpilz hat geschrieben:Warum kann man LOWER_BOUND und UPPER_BOUND nicht gleich 32 und 127 in dezimal Schreibweise übergeben?
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
aber 0x7F?!
@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.
- 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ß
Gruß
Mein Python-Blog.