Hallo gibt es eine Funktion die mir einen short int oder long int in einzelne Bytes (short=2,long=4) aufteilt oder muss mir das selbst zurecht shiften? danke.
Du brauchst kein shiften. Das geht ganz einfach mit ner union oder ein bischen pointer/cast Gewurstel.
Pointergewurschtel ist nicht notwendig. Sauber sieht es mit Unions aus. Als Beispiel vom PC ein Long mit byteweisem Auslesen, sollte sich auch auf µC-C übertragen lassen: union U{ char c[4]; long i; }; int main() { U u; u.i = 0x12345678; for (int i=3; i>=0; --i) printf("%x ", u.c[i]);
So, da fehlt jetzt die Hälfte, weil ich versucht habe TAB im Textfenster einzugeben und dann Submit ausgelöst habe ;) Die Unionlösung sieht eigentlich ganz elegant aus. Für was anderes fällt mir eigentlich auch kein sinnvoller Nutzen von Unions ein...
vielen dank, werds mit ne runion machen, sieht wirklich elegant aus. vielen dank!
> Pointergewurschtel ist nicht notwendig. Wäre aber besser. > Sauber sieht es mit Unions aus. Sauber ist das gar nicht. Unions sind für sowas eigentlich nicht gedacht. Laut C-Norm darf man aus einer Union auch nur das Member lesen, das man davor als letztes reingeschrieben hat. Geht halt meistens trotzdem, aber ist eigentlich eher ein Hack.
Bis letztes Jahr hatte ich bei dieser "union" Sache den Eindruck, dass nur Maschinen aus dem Neolithikum damit ein Problem haben würden. Das ja wohl alles was heute noch rumläuft das richtig behandeln wird. Denkste! Maxim hat es fertig gebracht, eine Architektur zu definieren, in der ein Pointer-to-Byte anders dargestellt wird, als ein Pointer-to-Word. Und weil MAXQ2000 nur 16bittig ist, kann er Speicher als 64K Worte oder als 64K Bytes adressieren. Also kann nur die Hälfte vom Speicher auch byteweise verwendet werden - eines der angesprochenen Urviecher hatte dafür ein 17.Adressbit im Carryflag, MAXQ nicht. Da können solche Tricks bös in die Hose gehen. Wüsste gerne welcher Teufel Maxim da geritten hat.
Da hat Rolf recht, ne union ist ein böser Hack und geht nur gut auf der gleichen CPU und mit der gleichen Compilerversion. Schieben ist dagegen immer richtig, also völlig Compiler und CPU-unabhängig. Und die meisten Compiler optimieren das auch sehr ordentlich, bzw. wenns einen Zyklus länger dauert, bricht man sich doch auch kein Bein. Peter
Für das unterste Byte brauch man nochnichtmals Schieben. long long_var = 0x12345678; char lbyte = long_var & 0x000000FF; Es müsste sogar ohne & Operator funktionieren. Für die anderen Bytes kann man aber mit Pointern handtieren: long long_var = 0x12345678; char byte = *( ((char *) &long_var ) + 1) ); // Gibt das Byte über dem untersten zurück. PS: Für was ist Union denn dann gedacht? Oder ist es eine "herzlos implementierte Funktion" die quasi Obsolet ist?
Unions sind ziemlich sinnlos ;) Aber vor dem Pointergemüse würde ich dann doch lieber schieben und Maskieren nehmen.
Hallo! Also wenn ich an so Begriffe wie Byte-Order denke, dann würde ich sagen, dass Shiften (von den hier vorgeschlagenen) Methoden die einzig richtige und sichere Methode ist. Sowohl beim hantieren mit Pointern als auch mit ner Union greift man da schnell daneben denk ich. mfg Reinhard
>>Aber vor dem Pointergemüse würde ich dann doch lieber schieben und
Maskieren nehmen.
Hast recht, ist doch wüster geworden als ich es mir gedacht habe
räusper.
Naja, lets shift it!
Pointer ist doch das gleiche, wie ne Union, da muß man auch die Byteorder kennen, sonst gehts schief. Ne Union macht durchaus Sinn, z.B. um einen Datensatz im EEPROM zu speichern. Da ja die gleiche CPU und die gleiche Compilerversion die Schreib- und die Leseroutine ausführen, ist die Byteorder im EEPROM völlig egal. Nach dem Lesen ist z.B ein float wieder ein float. Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.