Best Practice - Integer/Short in char array
-
Moin Leute,
ich hab mal ne Frage: Welche Methode ist ist besser?
inline unsigned short change_byte_order_unsigned_short(unsigned short x) { return ((x >> 8) & 0xFF) | ((x << 8) & 0xFF00); } .... char buffer[30]; *((unsigned short *) (&buffer[0])) = change_byte_order_U16(814); ...
Damit muss ich zwar nicht jedes einzelne Byte zuweisen (mein Ziel eine Struktur in ein char array umwandeln, die struktur hat unterschiedliche Datentypen, also nicht nur unsigned short), aber das ganze typecasting steht imho nicht im Verhältnis zum einfachen zuweisen zweier bytes. außerdem besteht die gefahr des overflows, wenn man nicht aufpasst. die alternative ist dann jedes byte einzeln zuzuweisen (die struktur hat zusammen ca. 30 bytes):
inline unsigned short unsigned_short_msb() {...} inline unsigned short unsigned_short_lsb() {...} char buffer[10]; buffer[0] = unsigned_short_msb(814); buffer[1] = unsigned_short_lsb(814); ...
Was meint ihr dazu, welches findet ihr besser?
-
zu schnell getippt. Beim zweiten Beispiel muss der Rückgabetyp der inline Funktionen natürlich char sein und nicht unsigned short.
-
Wie wäre es mit
void write_ordered_bytes(char *bytes, unsigned short x) { bytes[0] = x & 0x00FF; bytes[1] = x & 0xFF; } ... char buffer[30]; write_ordered_bytes(buffer, 814); write_ordered_bytes(buffer + 2, 1234); write_ordered_bytes(buffer + 4, 5678); ...
?
-
SeppJ schrieb:
Wie wäre es mit
void write_ordered_bytes(char *bytes, unsigned short x) { bytes[0] = x & 0x00FF; bytes[1] = x & 0xFF; }
ähm.
void write_ordered_bytes(char *bytes, unsigned short x) { bytes[0] = x & 0x00FF; bytes[1] = (x & 0xFF00) >> 8; }
?
-
Klar. Die eigentliche Wertzuweisung war mir nicht so wichtig, es ging ums Grundprinzip.