little endian - big endian
-
hallo
ich habe eine frage hinsichtlich des auslesens einer binaeren datei, deren bytes einmal in big und das andere mal in little endian ausgegeben wurden.
beim einlesen von in big endian abglegten bytes sieht das im programm folgendermassen aus:
bsp: big endianps->nFileSize = (pabyBuf[24] * 256 * 256 * 256 + pabyBuf[25] * 256 * 256 + pabyBuf[26] * 256 + pabyBuf[27]) * 2;
jetzt meine frage warum wird bei big endian der kleinste wert bzw. das letzte byte noch mit zwei multiplizert???
-
petersjo schrieb:
[...]der kleinste wert bzw. das letzte byte noch mit zwei multiplizert???
Vorsicht Klammern! Da wird nicht der letzte Wert sondern der ganze Wert mit 2 multipliziert. Übrigens ist der Code ja mehr als schrottig mit den Multiplikationen, das schnallt doch keine sau, was da eigentlich gemacht wird auf den ersten Blick. Hier wären die Bit-Schiebeoperatoren (<< bzw. >>) viel angebrachter.
(Btw. Multiplikation mit 2 könnte auch einfach ein Bitshift nach Links darstellen... scheinbar hatte der Autor dieser zeilen irgendwie das Shiften nicht so wirklich intus.)
-junix
-
Zumal das Shiften auch viel schneller ist als eine Multiplikation. Aber afaik optimiert der Compiler Multiplikationen mit konstanten Zweierpotenzen (wie in dem Fall) automatisch in Shift-Operationen.
-
MaSTaH schrieb:
Zumal das Shiften auch viel schneller ist als eine Multiplikation. Aber afaik optimiert der Compiler Multiplikationen mit konstanten Zweierpotenzen (wie in dem Fall) automatisch in Shift-Operationen.
... wenn das mal nicht ne Nullaussage ist? (o; Stimmt ist Compilerabhängig. Aber soviel ich weiss macht diese Optimierung so zimlich jeder Compiler...
-junix
-
Schon mal die Funktionen htonl(), htons(), ntohl() und ntohs() angeschaut?
-
danke fuer eure antworten.
koenntet ihr mir vielleicht ein kleines shiftbeispiel geben?
ausserdem lese ich meine binaere datei mit mit fread und memcpy aus:pabyBuf = (uchar *) malloc(41); fread( pabyBuf, 41, 1, psOVL->fpOVL ); memcpy( psOVL->ovlName, pabyBuf, 23 );
gibt es da einwaende?
-
Shiften (Bitweises schieben) funktioniert mit den entsprechenden Operatoren:
variable << n bedeutet nichts weiter, als dass der Inhalt von <variable> um <n> bit nach Links geschoben wird. Aus 0001 wird also zB (wenn n = 1) 0010.
> bedeutet das Selbe wie << aber hald nach rechts
<<= bzw. >>= sind die obigen Operatoren aber mit gleichzeitiger Zuweisung (ähnlich += etc.)-junix