Forum: Mikrocontroller und Digitale Elektronik int-Wert in char-Wert packen


von Bernd S. (mms)


Lesenswert?

Hallo,

wie kann ich jeweils zwei Stellen des Int-Wertes in genau einer Stelle 
des char Arrays packen?
1
unsigned int test = 0x00112233; 
2
3
char array[8]; 
4
5
/*
6
array[0] = 0x00
7
array[1] = 0x11
8
array[2] = 0x22
9
array[3] = 0x33
10
*/


Gruß
Bernd

von Ahem (Gast)


Lesenswert?

Was hast Du denn schon versucht?

von TestX .. (xaos)


Lesenswert?

hats nen speziellen grund wozu ? wenn du das damit zur übertragung 
splitten willst ists der falsche weg....

von Mark B. (markbrandis)


Lesenswert?

Zum Beispiel so:
1
#include <stdio.h>
2
3
int main()
4
{
5
  unsigned int test = 0x00112233; 
6
  char array[8]; 
7
8
  array[0] = test >> 24;
9
  array[1] = test >> 16;
10
  array[2] = test >>  8;
11
  array[3] = test >>  0;
12
13
  printf("array[0] = %x\n", array[0]);
14
  printf("array[1] = %x\n", array[1]);
15
  printf("array[2] = %x\n", array[2]);
16
  printf("array[3] = %x\n", array[3]);
17
18
  return 0;
19
}

von Bernd S. (mms)


Lesenswert?

>hats nen speziellen grund wozu ?

ja, der Int-Wert stellt eine IP-Adresse dar und soll in einem Char-Array 
paltziert werden für den HTTP Header Host - bei diesem wird diese 
Adresse vom Client angegeben - allerdings nur mit einem Wert pro Wert 
der IP.

Bernd

von Mark B. (markbrandis)


Lesenswert?

Wobei ich gerade sehe, dass meine Implementierung nicht besonders toll 
ist - so wird zum Beispiel aus 0x98765432 hinterher
ffffff98
76
54
32

Aber das war halt auch in einer Minute schnell zusammengehackt ;-)

von Robert W. (rweber)


Lesenswert?

Mark Brandis schrieb:
> Wobei ich gerade sehe, dass meine Implementierung nicht besonders toll
> ist - so wird zum Beispiel aus 0x98765432 hinterher

Kommt drauf an. Wenn dein "unsigned int" mind. 4 Bytes gross ist dann 
stimmts. Ansonsten sollte ein "unsigned long" genuegen.

Gruss,
rweber

von Mark B. (markbrandis)


Lesenswert?

So passt's:
1
  unsigned int test = 0x98765432; 
2
  unsigned char array[8];

von Robert W. (rweber)


Lesenswert?

Mark Brandis schrieb:
> So passt's:
>
>
1
>   unsigned int test = 0x98765432;
2
>   unsigned char array[8];
3
>

Wo soll denn da bitte der Unterschied sein? Wenn dein Int nur 2 Bytes 
gross ist, wird es durch die Zuweisung eines anderen Wertes auch nicht 
besser.

von Uhu U. (uhu)


Lesenswert?

Wie wärs denn damit:
1
union {
2
   unsigned int u;
3
   unsigned char array[4];
4
} test;
5
6
test.u = 0x98765432;

Vorausgesetzt natürlich, es gilt sizeof (unsigned int) == 4

von Mark B. (markbrandis)


Lesenswert?

Robert Weber schrieb:
> Wo soll denn da bitte der Unterschied sein? Wenn dein Int nur 2 Bytes
> gross ist, wird es durch die Zuweisung eines anderen Wertes auch nicht
> besser.

Ist 4 Byte groß. AMD x86 32-Bit-Prozessor, Windows XP, gcc / MinGW

Würde auch nicht viel Sinn machen, einer 16-Bit-Variablen den Wert 
0x98765432 zuweisen zu wollen. Oder anders gesagt, eine IP-Adresse hat 
mehr als 16 Bits. Und kein Vorzeichen. :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Vorausgesetzt natürlich, es gilt sizeof (unsigned int) == 4
Und die Endianess (Little oder Big) der Zielarchitektur passt.

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
Noch kein Account? Hier anmelden.