32bit (little endian) mit 16bit fractional part modifizieren
-
Ich habe ein für meine - ich gebe es zu - bescheidenen C++-Kenntnisse kniffliges Problem zu lösen. Ich möchte insgesamt 6 bytes aus einem unsigned char array herauslesen, mit 2.5 multiplizieren und anschliessend wieder in einen anderen unsigned char array schreiben. Das Problem dabei ist, dass diese 6 bytes wie folgt zusammengesetzt sind: Zuerst ein 32bit dword, gespeichert nach der little endian convention, dann ein 16bit word Bruchteil, auch als little endian. Wie also kann ich diese Zahl mit 2.5 multiplizieren und sie schliesslich wieder im selben little endian Format speichern?
Hier ein Beispiel zur Veranschaulichung:
Ausgangssituation: FF 01 00 00 00 A0
big endian: dword 00 00 01 FF und word A0 00 oder sozusagen 48bit-Wert 00 00 01 FF A0 00
Multiplikation mit 2.5: 00 00 04 FF 10 00 (ein overflow des word-Bruchteils muss eine inkrementierung des dword-Wertes zur Folge haben!)
zurück zu little endian: FF 04 00 00 und 00 10
-
Wenn du sowas hast
typedef struct { unsigned long part1; unsigned short part2; } strange; strange *s;
und das Glück, dass der Compiler diese struct so abbildet, wie du das willst (überprüfen, packed einstellen oder selber mit den offsets und pointer casts hantieren), dann sollte es eigentlich so gehen (nur für positive Zahlen):
unsigned long a = s->part2*5/2; s->part1 = s->part1*2 + s->part1/2 + (a>>16); s->part2 = (unsigned short) a;