Forum: Compiler & IDEs aus zwei ascii ein uint8_t machen


von Slowflyer (Gast)


Lesenswert?

Hallo,

ich würde gern wissen ob jemand schon mal zwei ascii-Zeichen (z.B. aus
einem LCD-Buffer) in ein unsigned char gewandelt hat? Gibt es irgendwo
eine fertige Funktion oder muss ich mir die Zahl mittels Multiplikation
selbst stricken?

Gruß Slowflyer

von pittbull (Gast)


Lesenswert?

normalerweise passen in ein uint8_t keine zwei zeichen. wenn du
allerdings nur ziffern hast (z.b. bcd-kodiert) dann könnte das gehen.
uint8_t packed = (bcd_left << 4) | (bcd_right & 0x0f);

von Slowflyer (Gast)


Lesenswert?

Das zwei da nicht reinpassen ist mir klar. Scheinbar hab ich mein
Problem nicht deutlich genug dargestellt. Ich versuch das Problem mal
an einem Beispiel klarer zu umreißen:

'2' und '3' als ASCII in 23 (dezimal) oder 0x17(hex) umwandeln.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du suchst atoi() (für beliebig lange Strings).  Für nur zwei
Ziffern, bei denen auch garantiert ist, dass es Ziffern sind,
geht natürlich auch
1
x = (ziff1 - '0') * 10 + (ziff2 - '0');

von Slowflyer (Gast)


Lesenswert?

Exakt das habe ich mir auch gerade überlegt,

dachte nur es gäbe vielleicht einen schlanken,schnellen Code (ich
brauch diese Fkt ziemlich oft.

Versuche es erstmal so, Danke!

von Slowflyer (Gast)


Lesenswert?

hmm... ich meinte so klein wie möglich

von Slowflyer (Gast)


Lesenswert?

Wenn ich mir das im Disassembler anschaue, beinhaltet die Fkt:

int8_t a2toi (int8_t zahl1, int8_t zahl2)
{
   return ((zahl1-0x30)*10+(zahl2-0x30));
}

ca. 50 Assembleranweisungen. Da ich den µC stromsparend betreibe und
die Taktfrequenz niedrig halten möchte, bekomme ich durch die Codelänge
ein Timing-Problem. Habe gehofft, das es irgendwie schneller geht und
ich die Taktfrequenz nicht erhöhen muss.

von Unbekannter (Gast)


Lesenswert?

Mit oder ohne Optimierungen?

von pittbull (Gast)


Lesenswert?

du kannst die multiplikation rausschmeissen, vielleicht wird es dadurch
besser. bei mikrocontrollern soll sowas ja manchmal wunder wirken:
--> x * 10 == (x<<3) + (x<<1);
d.h. aus
return (zahl1-0x30)*10+(zahl2-0x30);
könnteste sowas machen:
x = zahl1-0x30;
return (x<<3) + x + x + zahl2-0x30;

von Werner B. (Gast)


Lesenswert?

Ist es nicht einfacher sich die Daten zu merken bevor sie in ASCII
umgewandelt und in den LCD Buffer geschrieben werden?

von Rolf Magnus (Gast)


Lesenswert?

> d.h. aus
> return (zahl1-0x30)*10+(zahl2-0x30);
> könnteste sowas machen:
> x = zahl1-0x30;
> return (x<<3) + x + x + zahl2-0x30;

Ich biete ein:

x = (zahl1 - '0') << 1;
return (x<<2) + x + zahl2 - '0';

von Zotteljedi (Gast)


Lesenswert?

Von mir auch einer, für Leute mit genug Speicher:

static unsigned char a[] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90};
...
return a[zahl1 - '0'] + zahl2 - '0';

von Slowflyer (Gast)


Lesenswert?

Hallo Leute,

vielen Dank an dieser Stelle. Es gab ein paar ganz gute Vorschläge, die
ich mal ausprobieren werde.

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.