PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Byte Char zu Integer wandeln



herr.jth
22-03-2008, 23:55
Hallo,
ich kriege über einen Socket 2 Byte, die eine fortlaufende Zahl darstellen sollen.
Diese Zahl befindet sich jetzt in einem 2-Byte langen Buffer, praktisch so:

[ 123 ] [ 214 ]

Das wäre jetzt zusammen betrachtet 123214. Allerdings würde ich diesen Wert jetzt gerne als long haben. Falls das ganze in nur einem Byte untergebracht wäre, d.h. 0-255, wäre das ganze kein Problem, aber die 2 Byte machen mir Kopfschmerzen.

Die bisherige Bitshift-Lösung sah so aus:


act_size = (*ackbuf++ << 8);
act_size &= 0xff00;
act_size += (*ackbuf++ & 0x00ff);

was soweit auch funktionierte, zumindest auf meinem Little Endian Core 2. Jetzt sitze ich hier allerdings an einem Motorola G4 der Big Endian verwendet und das ganze funktioniert nichtmehr :(

Ich habe jetzt versucht die bytes einzeln rauszuziehen und mit atoi umzuwandeln, allerdings bringt mir das auch nichts wenn die Werte über 255 hinaus gehen und so das 2. Byte mit einbezogen werden muss...

Ich hoffe jemand hat eine Idee wie man sowas portabel lösen kann, ich bin hier langsam aber sicher am verzweifeln :(

Danke schonmal im vorraus :)

anda_skoa
23-03-2008, 11:22
Hallo,
ich kriege über einen Socket 2 Byte, die eine fortlaufende Zahl darstellen sollen.
Diese Zahl befindet sich jetzt in einem 2-Byte langen Buffer, praktisch so:

[ 123 ] [ 214 ]

Das wäre jetzt zusammen betrachtet 123214.

Du meinst 31702, oder?

Am besten du machst erstmal eine Lösung, die nur auf normaler Mathematik basiert und machst erst dann Optimierung mit Bitshift



long result = first_byte;
result *= 256; // oder hier * 1000 wenn dein Beispiel wirklich so gemeint war
result += second_byte;


Ciao,
_

jeebee
23-03-2008, 11:59
wegen Little/Big Endian: schau dir mal die folgenden Funktionen an.

unsigned long int htonl(unsigned long int hostlong);
Konvertiert einen unsigned long int von Host-Endian nach Network-Endian.

unsigned long int ntohl(unsigned long int netlong);
Konvertiert einen unsigned long int von Network-Endian nach Host-Endian.