Hallo,
nach dem lesen einer Zahl aus einer Datei habe ich diese als String vorliegen mit. Jetzt möchte ich diesen gerne um ein paar Bit nach rechts verschieben und erst danch auswerten.
Beispiel:
eingelesene Zeichenfolge: "\x02\x2C"
Rechtsshift um 1 Bit: "\x01\x16"
Wie kann ich das erreichen?
Bitweise Shift eines String/Zeichens
Hi,
Ich bin kein python-guru aber wenn ich das richtig sehe brauchst Du eine Integervariable die hier Zahl heißt :
damit shiftest Du Deine Zahl um eine Binärstelle nach rechts.
Aus 5 (101) wird 2 (10)
Wenn Du die Zahl noch als String vorliegen hast, wirst Du Deine Variable zuerst noch umwandeln müßen nach Integer.
hoffe das hilft
aX.
Ich bin kein python-guru aber wenn ich das richtig sehe brauchst Du eine Integervariable die hier Zahl heißt :
Code: Alles auswählen
Zahl >> 1
Aus 5 (101) wird 2 (10)
Wenn Du die Zahl noch als String vorliegen hast, wirst Du Deine Variable zuerst noch umwandeln müßen nach Integer.
hoffe das hilft
aX.
Code: Alles auswählen
"".join([chr(ord(x)>>1) for x in DEINSTRING])
Diese Operation benötigt leider eine Zahl und:aLeX_ hat geschrieben:brauchst Du eine Integervariable die hier Zahl heißt :Code: Alles auswählen
Zahl >> 1
Genau. Das habe ich mir inzwischen auch zusammengebastelt.aLeX_ hat geschrieben:Wenn Du die Zahl noch als String vorliegen hast, wirst Du Deine Variable zuerst noch umwandeln müßen nach Integer.
Code: Alles auswählen
struct.unpack( ">1H", "\x02\x2c")[0]>>3
+ Beim Shift nach rechts: keines. Alles ist OK
+ Beim Shift nach links: Wie groß können denn Zahlen in Python werden? Wenn ich in einer 2-Byte-Zahl einen Linksshift ausführe begrenzt sich der Wert der Zahl automatisch. Eine Pythonzahl kann aber größer werden. Wie groß? Kann ich das Shift irgendwie so begrenzen, als würde ich nur mit einer 2-Byte- oder einer 4-Byte-Zahl arbeiten?
Oh, diese Antwort war etwas schneller als meine. Ich brauche aber etwas Hilfe zum Verständnis der Operation:Joghurt hat geschrieben:Code: Alles auswählen
"".join([chr(ord(x)>>1) for x in DEINSTRING])
Code: Alles auswählen
ord(x)
Code: Alles auswählen
ord(x)>>1
Code: Alles auswählen
chr(...)
Code: Alles auswählen
[... for x in DEINSTRING]
Code: Alles auswählen
"".join(...)
Thomas
[/code]
Das habe ich auch so verstanden, wobei mich die Klammerung etwas wundert.
Du solltest hier aber dringend sicherstellen, dass Du nur Dezimalzahlen in deinem String hast, sonst mußt Du in der for-schleife alle ord-zahlen
'<48 and >57' rausfischen (Hex ??).
By the way wenn Du die Größe kennst, kannst Du immer mit 'Try : Except' Blöcken vor dem nächsten shiften testen, ob Dein Datentyp überhaupt noch groß genug für die nächste Zahl ist.
Evtl. kann Yoghurt an dieser Stelle was zu den Datentypen und Ihrer Größe sagen (ich denke es handelt sich um 4 Byte). Ich weiß im Moment nur, dass es auch Long-Int bei Python gibt. ich finde es eigenartig, dass ich nach 3 Minuten Googeln keine adequate Antwort auf diese Standardfrage habe
Du solltest hier aber dringend sicherstellen, dass Du nur Dezimalzahlen in deinem String hast, sonst mußt Du in der for-schleife alle ord-zahlen
'<48 and >57' rausfischen (Hex ??).
By the way wenn Du die Größe kennst, kannst Du immer mit 'Try : Except' Blöcken vor dem nächsten shiften testen, ob Dein Datentyp überhaupt noch groß genug für die nächste Zahl ist.
Evtl. kann Yoghurt an dieser Stelle was zu den Datentypen und Ihrer Größe sagen (ich denke es handelt sich um 4 Byte). Ich weiß im Moment nur, dass es auch Long-Int bei Python gibt. ich finde es eigenartig, dass ich nach 3 Minuten Googeln keine adequate Antwort auf diese Standardfrage habe

Das beruhigt mich.aLeX_ hat geschrieben:Das habe ich auch so verstanden, wobei mich die Klammerung etwas wundert.
By the way wenn Du die Größe kennst, kannst Du immer mit 'Try : Except' Blöcken

Das geht mir irgendwie öfter soich finde es eigenartig, dass ich nach 3 Minuten Googeln keine adequate Antwort auf diese Standardfrage habe

???aLeX_ hat geschrieben:Du solltest hier aber dringend sicherstellen, dass Du nur Dezimalzahlen in deinem String hast, sonst mußt Du in der for-schleife alle ord-zahlen
'<48 and >57' rausfischen (Hex ??).
Sein String besteht aus einzelnen Bytes, die er shiften will.
Aus 'Test' wird z.B. '*29:', da
'Test' = 0x54 0x65 0x73 0x74
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Das ist eine List Comprehension: [wiki]Neue Features#ListComprehensions[/wiki]Thomas W. hat geschrieben:Zerlegt dies DEINSTRING in einzlne Zeichen? Wird chr(...) dann wie in einer Schleife für jedes dieser Zeichen aufgerufen?Code: Alles auswählen
[... for x in DEINSTRING]
Thomas W. hat geschrieben:Das geht mir irgendwie öfter so. Ich habe zwar gute Anleitung gefunden, die mir bestimmte Python-Funktionen erklären, aber noch nicht kein Pendant, die mir sagt, welche Python-Funktion ich nutzen kann bzw. wie die Funktion in Python heißt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice