0x12345678 -> [0x12, 0x34, 0x56, 0x78]

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wie kann ich denn das erreichen: 0x12345678 -> [0x12, 0x34, 0x56, 0x78] ?

Ich hab schon ein wenig mit divmod probiert, komme aber nicht zum richtigen Ergebnis ;(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Code: Alles auswählen

In [481]: [hex(ord(c)) for c in struct.pack('>i', 0x12345678)]
Out[481]: ['0x12', '0x34', '0x56', '0x78']
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@jens:
Wenn Du rechnerisch zum Ergebnis kommen willst, ist divmod (bzw. & und >>) schon der richtige Ansatz. Was hast du denn probiert?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab das hier:

Code: Alles auswählen

        dividend = 0x12345678
        print hex(dividend)
        high_word, low_word = divmod(dividend, 0x10000)
        low_byte1, high_byte1 = divmod(high_word, 0x100)
        low_byte2, high_byte2 = divmod(low_word, 0x100)
        print hex(low_byte1), hex(high_byte1), hex(low_byte2), hex(high_byte2)
Ausgabe:

Code: Alles auswählen

0x12345678
0x12 0x34 0x56 0x78
Also eigentlich richtig. Aber recht umständlich, oder nicht?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Naja was heisst umständlich, recht explizit ausgeschrieben würd ich sagen, da es auch kürzer geht:

Code: Alles auswählen

def bytesplit(n):
    while n:
        yield n & 255
        n >>= 8

list(hex(i)for i in bytesplit(0x12345678))[::-1]
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

So:

Code: Alles auswählen

>>> [0x12345678>>(a<<3)&0xff for a in (3,2,1,0)]
[18, 52, 86, 120]
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

@Sirius3

Code: Alles auswählen

[hex(0x12345678>>(a<<3)&0xff) for a in (3,2,1,0)]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ach, die Breite ist auch wichtig...

Also nicht 0x1234 -> [0x12, 0x34]
sondern: 0x1234 -> [0x00, 0x00, 0x12, 0x34]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

fail hat geschrieben:@Sirius3

Code: Alles auswählen

[hex(0x12345678>>(a<<3)&0xff) for a in (3,2,1,0)]
Das nehme ich! Danke!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Code: Alles auswählen

In [484]: [hex(0x12345678 >> (i * 8) & 0xff) for i in reversed(xrange(4))]
Out[484]: ['0x12', '0x34', '0x56', '0x78']
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dafür habe ich das gebraucht: https://github.com/jedie/DragonPy/commi ... 2f9972d62f

Danke euch allen!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten