Ascii Dec in einzlne Ziffern zerlegen

OP #1530822
Lesenswert?

Hallo Leute, zuerstmal wünsch ich euch frohe Weihnachten.

Da ich zwischen den Mahlzeiten ein wenig Zeit hab bin ich natürlich am 
programmieren.
Und nun hab ich eine Frage:
Also folgendes:
Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex. Das sind Decimal 
68, da es sich um eine Temperatur handelt sind das 68°C. Diese 68° muss 
ich in zwei einzelne Chars zerlegen, also 6 und 8.
Wie bekomm ich das hin?
Habe schon wild rum geschiftet und -30 gerechnet aber der nimmt immer 
den Hexwert irgendwie und ich komm nicht auf das richtige Ergebnis.
Habt ihr da eine kleine Lösung parat?
atoi() hat auch nicht funktioniert.
Steh grad a bissl aufm Schlauch
#1530845
Lesenswert?

in assembler gehts auch
1
; Bcd - zahlen in 2 ASCII char ---   wert in aa - ergebnis in r6 und r7  h/l Byte
2
;  
3
bcdasc:
4
    mov   temp,aa    ; aa aufheben
5
    lsr  temp
6
    lsr  temp
7
    lsr  temp
8
    lsr  temp    ;Msb ins Lsb schieben
9
    ori    temp,0x30  ;$30 dazuodern erzeugt ascii 30 -39 da nur zahl 0-9
10
    mov    r6,temp
11
    andi  aa,0x0f    ;löschen des Msb
12
    ori    aa,0x30
13
    mov    r7,aa
14
    ret

frohes Fest
Gast #1530847
Lesenswert?

Christian Hohmann schrieb:
> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex. Das sind Decimal
> 68, da es sich um eine Temperatur handelt sind das 68°C. Diese 68° muss
> ich in zwei einzelne Chars zerlegen, also 6 und 8.


..ich verstehe das so:
1
char cIn = 0x44;
2
char cHi = '0' +(cIn /10);
3
char cLo = '0' +(cIn %10);
4

5
tu_was_mit_zehnergrad_im_klartext(cHi);
6
tu_was_mit_einergrad_im_klartext(cLo);

..alternativ..
1
char cIn = 0x44;
2
char cHi = cIn /10;
3
char cLo = cIn %10;
4

5
tu_was_mit_zehnergrad_absolut(cHi);
6
tu_was_mit_einergrad_absolut(cLo);

(Ungetestet, teipos und co bitte entfernen)

HTH
OP #1530848
Lesenswert?

>char* s = "44";
>char out[4] = {0};
>unsigned char c = (s[0] - '0') * 16 + (s[1] - '0')
>sprintf( out, "%d", c );

>sende(out);

Wo hab ich denn da meine 6 und 8 stehen?
Entschuldigung für meine unglückliche Ausdrucksweise.
Hier mal der Code wo die 6 und 8 rein kommen sollen, hoffe das hilft 
weiter
1
Value= 0x44; //Wird eigentlich der Funktion übergeben
2
if(TempIndex == 29) //BoilerTemperatur
3
{
4
         Sendstring[13]=0x32; // 2 Teilnehmer
5

6
           Sendstring[15]=('6'); <--- hier soll die 6 rein
7
  Sendstring[16]=('8'; <-- hier soll die 8 rein
8

9
  for(j=0; j<=18 ;j++) //Status senden
10
  {
11
    USART2_Transmit(Sendstring[j]);
12
  }

Die Werte sollen also in dem Array gespeichert werden
Persönliche Seite #1530854
Lesenswert?

Christian Hohmann schrieb:
> Sendstring[15]=('6'); <--- hier soll die 6 rein
> Sendstring[16]=('8'; <-- hier soll die 8 rein

Irgendwie hast du nen Knoten... %-)

Noch ne Variante:
1
sprintf(Sendstring[15], "%02u", Value);

Der Format String (%02u) bedeutet: 2 Stellige Unsigned-Int Zahl, ggf. 
mit führenden Nullen auffüllen.

Die Version mit Division und Modulo ist wahrscheinlich effizienter.
Gast #1530938
Lesenswert?

> >char* s = "44";
> >char out[4] = {0};
> >unsigned char c = (s[0] - '0') * 16 + (s[1] - '0')
> >sprintf( out, "%d", c );
> >sende(out);
>
> Wo hab ich denn da meine 6 und 8 stehen?

Du hast geschrieben:

> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex.

wo kommt da eine 6 vor? In out steht dann die 68 drin und das wolltest 
du ja.
Gast #1530997
Lesenswert?

Oben hab ich Dir die Lösung zwar schon mal geschrieben, jetzt servier 
ichs Dir mal in den Quellcode rein:

> Value= 0x44; //Wird eigentlich der Funktion übergeben
[..]
>    Sendstring[15]=('6'); <--- hier soll die 6 rein
>    Sendstring[16]=('8'; <-- hier soll die 8 rein

..wird damit zu..

     Sendstring[15]=('0' +(Value /10)); <--- hier ist die 6
     Sendstring[16]=('0' +(Value %10)); <--- hier ist die 8

Falls Du jemals Temperaturen über 100°C haben ★solltest★, dann musst Du 
das noch abfangen!

HTH und HF
Gast #1531040
Lesenswert?

Peter schrieb:
> @g457
> leider wissen wir nicht ob die 44 als sting vorliegt.

Doch, das wissen wir, dass sie das nicht tut:

Christian Hohmann schrieb:
> Value= 0x44; //Wird eigentlich der Funktion übergeben

HTH und ich hoffe, dass das die Unklarheiten jetzt beseitigt hat :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren