- Bei Big-Endian (wörtlich „Groß-Ender“)
wird das Byte mit den höchstwertigen Bits (d. h. die signifikantesten Stellen) zuerst gespeichert, das heißt an der kleinsten Speicheradresse. Allgemein bedeutet der Begriff, dass Daten mit dem größtwertigen Element zuerst genannt werden, wie etwa bei der deutschen Schreibweise der Uhrzeit: Stunde:Minute:Sekunde. - Bei Little-Endian (wörtlich „Klein-Ender“)
wird dagegen das Byte mit den niederstwertigen Bits (d. h. die am wenigsten signifikanten Stellen) an der kleinsten Speicheradresse gespeichert beziehungsweise das kleinstwertige Element zuerst genannt, wie bei der herkömmlichen deutschen Datumsschreibweise: Tag.Monat.Jahr.
#include <stdio.h> #include <stdint.h> typedef struct { union { uint16_t num; /* little-endian */ struct { uint8_t lo; uint8_t hi; }; struct { uint16_t lsb : 1; uint16_t lsb_1 : 1; uint16_t lsb_2 : 1; uint16_t lsb_3 : 1; uint16_t raw : 8; uint16_t msb_3 : 1; uint16_t msb_2 : 1; uint16_t msb_1 : 1; uint16_t msb : 1; }; }; } endian_t; void print_endian(endian_t endian) { printf("---------------------------\n"); printf(" 16: 0x%016lx 0x%04x\n", (uint64_t) &endian.num, endian.num); printf("lo 8: 0x%016lx 0x%02x\n", (uint64_t) &endian.lo, endian.lo); printf("hi 8: 0x%016lx 0x%02x\n", (uint64_t) &endian.hi, endian.hi); printf("MSB: %u\n", endian.msb); printf("LSB: %u\n", endian.lsb); printf("Bin: %u%u%u%u %u%u%u%u\n", endian.msb, endian.msb_1, endian.msb_2, endian.msb_3, endian.lsb_3, endian.lsb_2, endian.lsb_1, endian.lsb); } int main(int argc, char *argv[]) { endian_t endian; endian.num = 0x8000; print_endian(endian); endian.num = 0x4000; print_endian(endian); endian.num = 0x2000; print_endian(endian); endian.num = 0x1000; print_endian(endian); endian.num = 0x0008; print_endian(endian); endian.num = 0x0004; print_endian(endian); endian.num = 0x0002; print_endian(endian); endian.num = 0x0001; print_endian(endian); return 0; }
$ ./endian --------------------------- 16: 0x00007fffd2223e80 0x8000 lo 8: 0x00007fffd2223e80 0x00 hi 8: 0x00007fffd2223e81 0x80 MSB: 1 LSB: 0 Bin: 1000 0000 --------------------------- 16: 0x00007fffd2223e80 0x4000 lo 8: 0x00007fffd2223e80 0x00 hi 8: 0x00007fffd2223e81 0x40 MSB: 0 LSB: 0 Bin: 0100 0000 [...]
Byte-Reihenfolge
Bitwertigkeit
UART Communication from Linux Userspace
Byteorder
Mit Bit-Feldern
struct { #ifdef __ONE_ENDIANESS__ unsigned int b1:1; unsigned int b2:8; unsigned int b3:7; unsigned int b4:8; unsigned int b5:7; unsigned int b6:1; #define _STRUCT_FILLED #endif /* __ONE_ENDIANESS__ */ #ifdef __OTHER_ENDIANESS__ unsigned int b6:1; unsigned int b5:7; unsigned int b4:8; unsigned int b3:7; unsigned int b2:8; unsigned int b1:1; #define _STRUCT_FILLED #endif /* __OTHER_ENDIANESS__ */ }; #ifndef _STRUCT_FILLED # error Endianess uncertain for struct #else # undef _STRUCT_FILLED
Converting Endianess on a bit field structure
bit ordering and endianess