Forum: PC-Programmierung Python - str to bin


von Rike (Gast)


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

von Günter Lenz (Gast)


Angehängte Dateien:

Lesenswert?

Also für Binärstring in Dezimalzahl umwandeln
habe ich hier zwei Beispiele in QBASIC.
Vielleicht läßt sich der Algorithmus nach PYTHON
portieren.

von justmy2cents (Gast)


Lesenswert?

Weiß nicht ob ich dein Problem richtig verstehe, aber ist dir mit
1
bin_from_string = int(str, 2)
geholfen?

von justmy2cents (Gast)


Lesenswert?

bin_from_string sollte natürlich eher int_from_string heißen.

von Günter Lenz (Gast)


Angehängte Dateien:

Lesenswert?

Falls noch Interesse daran besteht,
ich bin gerade am Üben mit Python. Die Umwandlung
geht ja bei Python einfacher als bei QBasic.

von Simon S. (-schumi-)


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

: Bearbeitet durch User
von Günter Lenz (Gast)


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>

von Yalu X. (yalu) (Moderator)


Lesenswert?

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>')")

von Kaj G. (Firma: RUB) (bloody)


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.

: Bearbeitet durch User
von Günter Lenz (Gast)


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.

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
Noch kein Account? Hier anmelden.