C-Datentypen

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
t0m

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 :)
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

meinst du sowas:

Code: Alles auswählen

print 0xC2 | 0x41324D00 == 0x41324DC2
Das wäre eine Bitoperation "Or", gibts in jeder Sprache.

Gruss
Gast

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).
BlackJack

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.
t0m

Hi,
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));
Der gibt folgendes aus:
0x6c6c6568

Und 0x6c6c6568 & 0xff ist das 'h' von 'hallo' :)[/code]
rayo
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:

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
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:

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
Falls du was anderes wolltest, dann schreib mal was du im ganzen machen möchtest :)

Gruss
BlackJack

t0m hat geschrieben:Also folgender Code:

Code: Alles auswählen

unsigned char *test[5];
memcpy(test, "hallo", 5);
printf("0x%02x\n", *(unsigned long *)(test));
Der gibt folgendes aus:
0x6c6c6568

Und 0x6c6c6568 & 0xff ist das 'h' von 'hallo' :)[/code]
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.

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
Aber warum möchte man so etwas tun!?
Antworten