Hi, ich bin Python-Neuling und habe ein Problem. Ich bekomme einen binären Code als string-Eingangssignal. Fragt mich nicht warum... Ich will diesen string ('01010101') als Binären Code in meinem Programm verarbeiten. Hat jemend ne schnelle Lösung? Das Netz war jetzt nicht so aufschlussreich. Danke Euch, Rike
Also für Binärstring in Dezimalzahl umwandeln habe ich hier zwei Beispiele in QBASIC. Vielleicht läßt sich der Algorithmus nach PYTHON portieren.
Weiß nicht ob ich dein Problem richtig verstehe, aber ist dir mit
1 | bin_from_string = int(str, 2) |
geholfen?
Falls noch Interesse daran besteht, ich bin gerade am Üben mit Python. Die Umwandlung geht ja bei Python einfacher als bei QBasic.
Günter Lenz schrieb: > Falls noch Interesse daran besteht, > ich bin gerade am Üben mit Python. Die Umwandlung > geht ja bei Python einfacher als bei QBasic. Die Lösung mit eval() ist garnicht gut! Damit reisst du Sicherheitslücken in das Programm, größer als jedes Scheunentor. Der String den du eval() übergibst wird nämlich wie normaler Pythoncode interpretiert. Wenn jetzt jemand z.B. os.system("rm -rf /*") anstatt einer Binärzahl eingibt, werden alle Dateien auf dem Computer gelöscht auf die der User Zugriff hat. justmy2cents hat die richtige Lösung schon gegeben:
1 | >>> int('01010101',2) |
2 | 85 |
:
Bearbeitet durch User
Ich habe deinen Vorschlag
>>> int('01010101',2)
85
ausprobiert, es funktioniert, Danke.
Dann habe mein Programm noch mal getestet,
mit einem Sytembefehl statt einem Binärstring.
Es passiert auch nichts gefährliches, es kommt
nur eine Fehlermeldung. Auf eval bin ich gekommen,
weil es in QBasic soetwas ähnliches gibt,
aber nur mit Dezimalstrings.
rem QBasic
x=val"85"
-------------------------------------------------------
Mein Testlauf:
Das Programm addiert zwei Binaerzahlen
Binaerzahl? dir
Binaerzahl? dir
0bdir
0bdir
Traceback (most recent call last):
File "D:\PYTHON31\prog.py", line 36, in <module>
x=eval(a)
File "<string>", line 1
0bdir
^
SyntaxError: invalid token
D:\PYTHON31>
Günter Lenz schrieb: > Es passiert auch nichts gefährliches Dann probier mal folgende Eingabe:
1 | 0 or exec("import os; os.system('<böses Shell-Kommando>')") |
Günter Lenz schrieb: > Es passiert auch nichts gefährliches https://docs.python.org/3.4/library/functions.html?highlight=eval#eval
1 | The expression argument is parsed and evaluated as a Python expression [...] This means |
2 | that expression normally has full access to the standard builtins module and restricted |
3 | environments are propagated. |
4 | |
5 | See ast.literal_eval() for a function that can _safely_ evaluate strings with expressions |
6 | containing only literals. |
https://docs.python.org/3.4/library/ast.html#ast.literal_eval
1 | This can be used for safely evaluating strings containing Python values from |
2 | untrusted sources [...] |
Davon auszugehen, das ein Benutzer schon nichts boeses Eingeben wird, hat schon viele Sicherheitsluecken geschaffen. Fuer alle Benutzereingaben gilt Grundsaetzlich, immer und ueberall, voellig egal welche Sprache, OS, usw.: All input is evil until proven otherwise! War immer so, wird immer so sein. Wenn sogar in der Sprach-Doku darauf hingewiesen wird, das die Funktion unsicher ist, dann sollte man das beherzigen.
:
Bearbeitet durch User
Yalu X. schrieb: >Dann probier mal folgende Eingabe: >0 or exec("import os; os.system('<böses Shell-Kommando>')") Habe ich ausprobiert, es funktioniert tatsächlich. Für <böses Shell-Kommando> habe ich <dir> eingesetzt. Sehr interessant! Ich habe mal ein wenig mit <or> gespielt, die Logik heißt also wenn links von <or> null ist wird die rechte Seite ausgefürt. Aber ein Risiko besteht ja erst wenn jemand anderes das Programm benutzt, oder jemand aus der Ferne das Programm starten kann. Aber wenn jemand aus der Ferne übers Internet auf meinen Computer Programme starten kann, hat er ja sowiso schon die volle Kontrolle, da ist er auf dieses Programm auch nicht mehr angewiesen. Wenn so ein Programm auf einen Server liegt das von vielen Leuten benutzt wird, ist das schon eine Sicherheitslücke. Mein Ziel, Python zu lernen, ist es die Programme für mich Lokal zu nutzen, und irgendwann damit eine serielle Datenkommunikation zu einem Mikrocontroller hinzubekommen. Vielen Dank noch mal für die Hinweise.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.