unsigned int in einzelne Bytes zerlegen
-
Hallo,
ich würde gerne einmal wissen wie ich die 4byte eines unsigned int einzeln erhalten kann.
unsigned int = 1A2B3C4D
unsigned char[] = [1A, 2B, 3C, 4D]Also so in etwa
bye Saxony
-
Hallo cih nochmal
Andersrum gefragt:
Ist folgendes schon ein byteweises xor über alle 4bytes des unsigned int ?
unsigned char crc = 0; unsigned int number = 0x1A2B3C4D; crc ^= number;
Vielen Dank
Saxony
-
Saxony007 schrieb:
ich würde gerne einmal wissen wie ich die 4byte eines unsigned int einzeln erhalten kann.
das niederwertigste byte kriegste mit 'x & 0xff'. dann shifteste x acht bits nach rechts und machst wieder 'x & 0xff' usw. von 0 bis sizeof(int)-1. statt des 'x & 0xff' kannste auch ein type-cast nach 'unsigned char' nehmen.
Saxony007 schrieb:
Ist folgendes schon ein byteweises xor über alle 4bytes des unsigned int ?
unsigned char crc = 0; unsigned int number = 0x1A2B3C4D; crc ^= number;
nö, dabei wird nur das unterste byte (0x4d) von 'number' berücksichtigt, weil das ergebnis ja nur als 'unsigned char' gebraucht wird.
-
net schrieb:
dann shifteste x acht bits nach rechts und machst wieder 'x & 0xff' usw. von 0 bis sizeof(int)-1.
Oder du schreibst x & 0xFF00, dann bleibt deine Quelle unverändert.
-
Hallo,
so habe ich das jetzt.
unsigned char bytes[3]; unsigned int number = 0x1A2B3C4D; bytes[0] = (number ) & 0xFF; bytes[1] = (number >> 8) & 0xFF; bytes[2] = (number >> 16) & 0xFF; bytes[3] = (number >> 24) & 0xFF;
Vielleicht auch noch mit cast:
bytes[1] = (unsigned char)((number >> 8) & 0xFF);
Vielen Dank
bye Saxony
-
oder als macro. ist in manchen situationen vielleicht angenehmer:
#define BYTE_AT_POSITION(x,b) (unsigned char)((x)>>((b)<<3))
/* testing... */ void main() { unsigned int x = 0x12345678; printf ("byte0: %02x\n", BYTE_AT_POSITION(x, 0)); printf ("byte1: %02x\n", BYTE_AT_POSITION(x, 1)); printf ("byte2: %02x\n", BYTE_AT_POSITION(x, 2)); printf ("byte3: %02x\n", BYTE_AT_POSITION(x, 3)); }
-
net schrieb:
oder als macro. ist in manchen situationen vielleicht angenehmer:
#define BYTE_AT_POSITION(x,b) (unsigned char)((x)>>((b)<<3))
Dein Macro ist für das "little endian" - Format richtig, für "big endian" ebenso.
Wenn die Frage steht "..wie ich die 4 byte eines unsigned int einzeln erhalten kann." Stellt sich
doch, was die Reihenfolge der Bytes in einem unsigned int angeht, auch die Frage geschrieben von "little endian" oder "big endian" CPU.#define BYTE_AT_POSITION(x,b) *((unsigned char *)(&x)+b)
Dieses Macro liefert für beide Formate auch das richtige Ergebnis.
mfg
-
Richtig oder falsch ist hier wohl eher eine Frage dessen was der OP will. Da er dazu keine genauen Angaben gemacht hat sind beide Makros falsch und richtig.