Seite 1 von 1

Bitweise Shift eines String/Zeichens

Verfasst: Dienstag 20. Juni 2006, 10:48
von Thomas W.
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?

Bitwise right shift

Verfasst: Dienstag 20. Juni 2006, 11:56
von aLeX_
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.

Verfasst: Dienstag 20. Juni 2006, 12:06
von Joghurt

Code: Alles auswählen

"".join([chr(ord(x)>>1) for x in DEINSTRING])

Re: Bitwise right shift

Verfasst: Dienstag 20. Juni 2006, 12:17
von Thomas W.
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?

Verfasst: Dienstag 20. Juni 2006, 12:27
von Thomas W.
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]

Verfasst: Dienstag 20. Juni 2006, 12:45
von aLeX_
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 :(

Verfasst: Dienstag 20. Juni 2006, 13:41
von Thomas W.
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.

Verfasst: Dienstag 20. Juni 2006, 15:52
von Joghurt
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

Verfasst: Dienstag 20. Juni 2006, 16:23
von Leonidas
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.

Verfasst: Mittwoch 21. Juni 2006, 17:00
von aLeX_
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)