Python - str to bin

Gast #3975205
Lesenswert?

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
#3995661
Lesenswert?

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
Gast #3995684
Lesenswert?

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>
(Firma: RUB) #3996393
Lesenswert?

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.
Gast #3997149
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren