Bitweise Shift eines String/Zeichens

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Thomas W.
User
Beiträge: 17
Registriert: Sonntag 9. April 2006, 08:36
Wohnort: Halle (Saale)

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?
Benutzeravatar
aLeX_
User
Beiträge: 6
Registriert: Montag 19. Juni 2006, 15:35

Hi,

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
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.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Code: Alles auswählen

"".join([chr(ord(x)>>1) for x in DEINSTRING])
Thomas W.
User
Beiträge: 17
Registriert: Sonntag 9. April 2006, 08:36
Wohnort: Halle (Saale)

aLeX_ hat geschrieben:brauchst Du eine Integervariable die hier Zahl heißt :

Code: Alles auswählen

Zahl >> 1
Diese Operation benötigt leider eine Zahl und:
aLeX_ hat geschrieben:Wenn Du die Zahl noch als String vorliegen hast, wirst Du Deine Variable zuerst noch umwandeln müßen nach Integer.
Genau. Das habe ich mir inzwischen auch zusammengebastelt.

Code: Alles auswählen

struct.unpack( ">1H", "\x02\x2c")[0]>>3
Und hier ist mein Problem damit.
+ 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?
Thomas W.
User
Beiträge: 17
Registriert: Sonntag 9. April 2006, 08:36
Wohnort: Halle (Saale)

Joghurt hat geschrieben:

Code: Alles auswählen

"".join([chr(ord(x)>>1) for x in DEINSTRING])
Oh, diese Antwort war etwas schneller als meine. Ich brauche aber etwas Hilfe zum Verständnis der Operation:

Code: Alles auswählen

ord(x)
Gibt den ASCII-Zeichencode von x zurück ...

Code: Alles auswählen

ord(x)>>1
... und führt einen Shift um 1 bit nach rechts aus.

Code: Alles auswählen

chr(...)
Das Ergebnis wird wieder in ein Zeichen umgewandelt.

Code: Alles auswählen

[... for x in DEINSTRING]
Zerlegt dies DEINSTRING in einzlne Zeichen? Wird chr(...) dann wie in einer Schleife für jedes dieser Zeichen aufgerufen?

Code: Alles auswählen

"".join(...)
Dies müsste dann all die einzelnen Ergebnisse der "Schleife" wieder zusammenführen, oder?

Thomas
[/code]
Benutzeravatar
aLeX_
User
Beiträge: 6
Registriert: Montag 19. Juni 2006, 15:35

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 :(
Thomas W.
User
Beiträge: 17
Registriert: Sonntag 9. April 2006, 08:36
Wohnort: Halle (Saale)

aLeX_ hat geschrieben:Das habe ich auch so verstanden, wobei mich die Klammerung etwas wundert.
Das beruhigt mich.
By the way wenn Du die Größe kennst, kannst Du immer mit 'Try : Except' Blöcken
:o Muss mir mal ansehen was das ist und wie es funktioniert. Danke für den Hinweis.
ich finde es eigenartig, dass ich nach 3 Minuten Googeln keine adequate Antwort auf diese Standardfrage habe :(
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.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Thomas W. hat geschrieben:

Code: Alles auswählen

[... for x in DEINSTRING]
Zerlegt dies DEINSTRING in einzlne Zeichen? Wird chr(...) dann wie in einer Schleife für jedes dieser Zeichen aufgerufen?
Das ist eine List Comprehension: [wiki]Neue Features#ListComprehensions[/wiki]
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
Benutzeravatar
aLeX_
User
Beiträge: 6
Registriert: Montag 19. Juni 2006, 15:35

Joghurt hat geschrieben: Sein String besteht aus einzelnen Bytes, die er shiften will.

Aus 'Test' wird z.B. '*29:', da
'Test' = 0x54 0x65 0x73 0x74
ööha da habe ich wohl zu schnell geschossen...... 8)
Antworten