Hiho,
ist ein etwas "spezielles" Thema, aber ich hoffe trotzdem das mir jemand helfen kann .
Also ich bin gerade dabei einen C-Code in Python und dannach in andere Sprachen wie VB.Net usw zu konvertieren. Aber ich hab Probleme mit dem Datentyp unsigned long. Ich möchte den Wert einer solchen Variable in char umwandeln und umgekehrt. Einer unsigned long Variable wird z.B. der Wert 0x41324DC2 zugewiesen. OK, in Python muss ich dann ja nur 0x41324DC2 & 0xFF schreiben, und schon hab ich das 0xC2.
Das Problem ist aber, das ich nicht weiß wie ich das anders rum mache, also 0xC2 in 0x41324DC2. Da muss es doch in Python eine Möglichkeit geben?
danke
C-Datentypen
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
meinst du sowas:
Das wäre eine Bitoperation "Or", gibts in jeder Sprache.
Gruss
Code: Alles auswählen
print 0xC2 | 0x41324D00 == 0x41324DC2
Gruss
Hallo,
ja aber das 0x41324D00 ist nicht bekannt. Man muss das doch irgendwie aus der Zahl 0xC2 erschließen können, denn der C-Compiler erstellt die Zahl ja auch immer gleich (0xC2 -> 0x41324DC2).
ja aber das 0x41324D00 ist nicht bekannt. Man muss das doch irgendwie aus der Zahl 0xC2 erschließen können, denn der C-Compiler erstellt die Zahl ja auch immer gleich (0xC2 -> 0x41324DC2).
Bitte? Wenn ich in C ein `char` in ein `long` "caste", dann hat der genau den gleichen Wert, nur eben "links" mehr Nullbytes.
Also 0xc2 -> 0x000000c2. Wobei ich jetzt mal von meinem PC ausgehe, wo ein `long`, genau wie ein `int`, 4 Bytes lang ist. Das muss ja nicht so sein.
Also 0xc2 -> 0x000000c2. Wobei ich jetzt mal von meinem PC ausgehe, wo ein `long`, genau wie ein `int`, 4 Bytes lang ist. Das muss ja nicht so sein.
Hi,
erstmal sorry, ich hab nich soviel Ahnung von C.
Also folgender Code:
Der gibt folgendes aus:
0x6c6c6568
Und 0x6c6c6568 & 0xff ist das 'h' von 'hallo' [/code]
erstmal sorry, ich hab nich soviel Ahnung von C.
Also folgender Code:
Code: Alles auswählen
unsigned char *test[5];
memcpy(test, "hallo", 5);
printf("0x%02x\n", *(unsigned long *)(test));
0x6c6c6568
Und 0x6c6c6568 & 0xff ist das 'h' von 'hallo' [/code]
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
Hi
Also da macht C irgendwas mit Pointers (das *), jedoch brauchst du sowas nie in Python. Schreib mal was du machen möchtest, dann können wir dir die Python-Art zeigen. Da sich C und Python ziemlich unterscheiden, ists meistens keine so gute Idee, den Code direkt umzuschreiben.
Willst du einfach den String in seine ensprechende Zahl umwandeln?
Das ginge so:
Ist jetzt nicht die schnellste Lösung, aber sie sollte Funktionieren. So ist die Zahl einfach genau umgekehrt wie in C, falls du es genau andersrum willst gehts so:
Falls du was anderes wolltest, dann schreib mal was du im ganzen machen möchtest
Gruss
Also da macht C irgendwas mit Pointers (das *), jedoch brauchst du sowas nie in Python. Schreib mal was du machen möchtest, dann können wir dir die Python-Art zeigen. Da sich C und Python ziemlich unterscheiden, ists meistens keine so gute Idee, den Code direkt umzuschreiben.
Willst du einfach den String in seine ensprechende Zahl umwandeln?
Das ginge so:
Code: Alles auswählen
text = 'hallo'
res = 0
for char in text:
res = (res << 8) | ord(char)
print '%x' % res
print '%02x' % (res & 0xFF)
text = ''
while res != 0:
text = chr(res&0xFF) + text
res = res >> 8
print text
Code: Alles auswählen
text = 'hallo'
res = 0
for pos,char in enumerate(text):
res = res | (ord(char) << (pos*8))
pos += 1
print '%x' % res
print '%02x' % (res & 0xFF)
text = ''
while res != 0:
text = text + chr(res&0xFF)
res = res >> 8
print text
Gruss
Genau, und das 0x65 davor ist ein 'a' und die beiden 0x6c davor sind 'l's. Du sagst in Deinem Quelltext, dass Du die ersten 4 Bytes, also als Zeichen "hall", gerne als vorzeichenlosen `long` ausgeben möchtest.t0m hat geschrieben:Also folgender Code:Der gibt folgendes aus:Code: Alles auswählen
unsigned char *test[5]; memcpy(test, "hallo", 5); printf("0x%02x\n", *(unsigned long *)(test));
0x6c6c6568
Und 0x6c6c6568 & 0xff ist das 'h' von 'hallo' [/code]
Das kann man in Python zum Beispiel so machen:
Code: Alles auswählen
In [27]: import struct
In [28]: test = 'hallo'
In [29]: print '0x%x' % struct.unpack('L', test[:struct.calcsize('L')])[0]
0x6c6c6168