Forum: Compiler & IDEs 3 hex werte in dezimalwert umwandeln


von holgie (Gast)


Lesenswert?

Hallo zusammen,
ich habe 3 hexwerte in einem Array.
dat[0]=0x71
dat[1]=0x10
dat[2]=0x95 und möchte diese in einen Dezimalwert umwandeln. Es müsste 
also 7409813 ergeben. Ich erhalte jedoch 4245.
Ich hätte gedacht dass ich jeweils die Bits um 8 Stellen shiften muss. 
Im Internet habe ich aber etwas anderes gefunden was ich aber leider 
nicht verstehe und wohl auch nicht richtig umgesetzt bekomme. Vielleicht 
kann mir jemand weiterhelfen. Die wichtigen Stellen im Code habe ich mit 
Bemerkungen versehen. Ich hoffe die Infos sind ausreichend.
Gruß
Holger

Mein Code
1
 
2
3
unsigned char data[100],dat[6], a=0,b=0,c=0,d=0;
4
unsigned char wert[50];
5
6
while(1)
7
{ 
8
   a++;
9
   data[a] = uart_getchar();
10
11
if (data[a] == 0xFF && data[a-1] ==0x00 && data[a-2] ==0x08 && data[a-3]==0x01) 
12
  {
13
   b=1;
14
   a=5;
15
  }
16
if (b ==1 && data[a] == 0x69)
17
  {
18
   c=1;
19
  }
20
if (c ==1 && data[a] != 0x00 && data[a] != 0x01 && data[a] != 0x69)
21
  {
22
  //uart_putchar(data[a]);
23
    dat[d]=data[a];  //*****HEX WERT WIRD IN ARRAY übergeben*****
24
  uart_putchar(dat[d]);//**** die einzelnen Werte sind in Ordnung****
25
  uart_putchar(d);
26
    d++;
27
  }
28
if (c ==1 && data[a]==0x01)
29
  {
30
    uint32_t zahl = *(uint32_t*)dat;//*****HEX Array in uint32 umwandeln****
31
    itoa(zahl,wert,10);//*****zahl in wert konvertieren*****
32
    uart_putstring(wert);// *****Wert an uart übergeben******
33
    c=0;
34
    b=0;
35
    a=5;
36
    d=0;
37
  }
38
39
if (a >98)
40
  {
41
    a = 0;
42
  }
43
44
}

von Stefan (Gast)


Lesenswert?

Hallo,

leider sagst du nichts darüber welche "Maschine" du verwendest.
Es gibt halt "big-endian" und "little-endian" Prozessoren und auch 
welche bei denen ist ein Integer 16 Bit lang und bei anderen 32 Bit.

Wenn du also einen 32-Bit Wert zusammen bastelst genügt es nicht 4 Bytes 
in ein Array zu schreiben und zu hoffen "das geht schon".

Wenn du es nicht weisst oder darum kümmern willst dann schreib

>>uint8_t  a,b,c,d;
>>uint32_t zahl;

>>zahl = (a<<24) | (b<<16) | (c<<8) | d;


dann macht es der Compiler für dich !!!

Spätestens bei itoa oder ltoa musst du wissen was Sache ist!!!

von MWS (Gast)


Lesenswert?

Du musst die Chars erst casten, sonst können die Shifts darauf nicht 
richtig ausgeführt werden.
1
rslt = ((uint32_t) dat[0] << 16) + ((uint16_t) dat[1] << 8) + dat[2];

von Ralf G. (ralg)


Lesenswert?

Günstig wäre, dat[0] mit einzulesen! ;-)

Stefan schrieb:
> Es gibt halt "big-endian" und "little-endian" Prozessoren

= ganz wichtig. Sauber wäre es die einzelnen Bytes entsprechend 
aufzuaddieren und nicht nur einen Zeiger draufzusetzen.
(siehe MWS (Gast))

von Olek (Gast)


Lesenswert?

für sowas gibts den Datentyp "union"

union X
{
 byte A;
 byte B;
 int AB;
}

X.A = 0;
X.B = 1;


cout<<AB;

von Karl H. (kbuchegg)


Lesenswert?

Olek schrieb:
> für sowas gibts den Datentyp "union"
>
> union X
> {
>  byte A;
>  byte B;
>  int AB;
> }

fast

union X
{
  struct {
    byte A;
    byte B;
  }
  int AB;
}

Du musst schon dafür sorgen, dass A und B auch hintereinander im 
Speicher angeordnet werden. So wie du das hast, werden alle 3 Member 
übereinander gelegt.

von Rolf Magnus (Gast)


Lesenswert?

Olek schrieb:
> für sowas gibts den Datentyp "union"

Nein. Genau für sowas ist der nicht gedacht.

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.