Wie kann ich char in integer umwandeln?
-
Ich lese einen Block von Zeichen aus einem Stream ein. An einer Stelle z.B 4 sind genau 4 Zeichen (Bytes) die ich in einen Integer umwandeln möchte. Jetzt aber nicht in der Art das der Text einfach Zahlen sind, was ja mit strol ginge, sondern beliebige Werte haben können. Für mich sollen die 4 Zeichen zusammen ein 32bit Integer sein - sprich hexadezimal würden die z.B so aussehen:
0xD1 // c[6]
0x31 // c[7]
0x00 // c[8]
0x00 // c[9]
bzw zusammen 0xD1310000 das umgewandelt dann ein Integer 3509649408 ist.Nur wie mach ich das?
-
Ganz einfach:
Zahl = c[9] * 256^0 + c[8] * 256 + c[7] * 65535 + c[6] * ........
Also immer 256^n mit n = 0,1,2,3,....
Gruß,
Andreas
-
hronny schrieb:
0xD1 // c[6]
0x31 // c[7]
0x00 // c[8]
0x00 // c[9]
bzw zusammen 0xD1310000 das umgewandelt dann ein Integer 3509649408 ist.oder so:
unsigned long n; n = c[6]; n <<= 8; n |= c[7]; n <<= 8; n |= c[8]; n <<= 8; n |= c[9];
-
Danke, habe es so gelöst!
int p,q,i,l,m; unsigned char c[] = "AD"; j = 0; l = 0; for (i=(sizeof(c)-2); i>=0; i--) { m = pow(256,l); j += (c[i] * m) ; l++; }
-
^^das sieht aber nicht toll aus. ich würde zumindest das 'pow' nicht verwenden, weil das mit 'double' rechnet, was hier echt übertrieben ist.
-
Ok, was soll ich statdessen denn nehmen? mit ^ klappt es nicht.
-
hronny schrieb:
Ok, was soll ich statdessen denn nehmen? mit ^ klappt es nicht.
^ steht in C auch für 'xor'. wenn du 256^n haben willst, dann fang mit 1 an (ist 256^0) und shifte immer 8bits nach links. das kannste aber nur 3 mal machen, weiter reicht ein 4-byte unsigned long nicht mehr.
-
Das nicht mehr reinpasst ist klar, sind ja nur 32 bit
Mein Problem ist nur das die Länge zwischen 1 und 4 liegen kann, ob das mit dem "shiften" dann auch einfach so geht? Sicher nicht ohne separate if Abfragen.
-
hronny schrieb:
Mein Problem ist nur das die Länge zwischen 1 und 4 liegen kann, ob das mit dem "shiften" dann auch einfach so geht? Sicher nicht ohne separate if Abfragen.
ich meinte ja auch, dass du shifts statt 'pow' machst. in deinem vorhandenen code könnteste m mit 1 initialisieren, die pow-zeile rausschmeissen und dann, als letzte zeile in der schleife, einfach ein m <<= 8; einfügen. dann sollte es so laufen wie bisher.
-
Geil, geht ja super und auch ein wenig schneller! Omg muss ich noch viel lernen. Danke!!
-
hronny schrieb:
Geil, geht ja super und auch ein wenig schneller!
ein wenig? ich schätze es ist 1000mal schneller oder so (kommt drauf an, wie 'pow' implementiert ist).
probier mal so:// b: zeigt auf die bytes // l: anzahl bytes (mindestens 1, hoechstens 4) unsigned long read_value (unsigned char *b, int l) { unsigned long n = *b++; while (--l) n = n<<8 | *b++; return n; }