Ich würde gerne eine uint16 mit den einzelnen Zeichen in ein fünfer
Chararray rumschreiben. Verzweifel aber gerade daran...
Beispiel: Vorgegeben habe ich z.b.:
1
uint16=12345
2
3
//und möchte daraus:
4
5
char={1,2,3,4,5}
Mit Bitshifften komme ich da ja nicht wirklich weiter, außer halt Bit
1-4 (letzte Stelle)
Kann mir jemand einen Ansatzpunkt geben wo ich da anfangen kann?!
Draco schrieb:> Ich würde gerne eine uint16 mit den einzelnen Zeichen in ein fünfer> Chararray rumschreiben. Verzweifel aber gerade daran...>> Beispiel: Vorgegeben habe ich z.b.:>>
1
>uint16=12345
2
>
3
>//und möchte daraus:
4
>
5
>char={1,2,3,4,5}
6
>
7
>
>> Mit Bitshifften komme ich da ja nicht wirklich weiter, außer halt Bit> 1-4 (letzte Stelle)>> Kann mir jemand einen Ansatzpunkt geben wo ich da anfangen kann?!
Spontan:
Mit itoa() in einen String umwandeln und dann die Zeichen einzeln
aufsplitten.
PS: Bist du sicher dass du
Michael K. schrieb:> Spontan:>> Mit itoa() in einen String umwandeln und dann die Zeichen einzeln> aufsplitten.>> PS: Bist du sicher dass du> char[] = {1,2,3,4,5}> machen möchtest und nichtchar[] = {'1','2','3','4','5'}?
Ja ich brauche die Hex von den Integer für die einzelnen Zahlen, die Hex
für '5' z.b. ist ja 0x53 = 0b00110101.
Michael K. schrieb:> Na dann versuch malchar myChar = '5';> uint8_t ascii_code = (uint8_t)myChar;> und freu dich. Das kann der Compiler schon alleine, da musst du nicht> selber schubsen ;)
Danke für den Versuch :D
Aber nein, also mein Compiler wandelt da nichts um von Char in uint8 :)
Da bekomme ich dennoch den Hex Code für die Char '5' (also 35 bzw 53 bei
littleendian)
Karl M. schrieb:> Draco,>> Du willst ja keine Ziffer/Zahl als Zeichen kodiert sondern nur die 5> Ziffern speichern.>> Dann ist der Modulo Operator dein Freund.a= 12345;> d = a % 10 // d = 5> a = a / 10;> // nächste Stelle> d = a % 10 // d = 4> a = a / 10;> // usw.
Ohhh super! Danke, genau das hab ich gesucht :)
Draco schrieb:> Da bekomme ich dennoch den Hex Code für die Char '5' (also 35 bzw 53 bei> littleendian)
Oben habe ich dich so verstanden, dass du doch genau das willst, also
den ASCII-Wert der Ziffer.
Draco schrieb:> Ohhh super! Danke, genau das hab ich gesucht :)
Dann solltest du aber auch ein Integer-Array benutzen und kein
Char-Array. Habe dich nämlich deshalb anscheinend falsch verstanden ;)
Draco schrieb:> also mein Compiler wandelt da nichts um von Char in uint8
Ist ja zum Glück eh' das Selbe...
> Char '5' (also 35 bzw 53 bei littleendian)
Little und Big-Endian geht aber nicht bis auf die Nibble-Ebene runter,
sondern es mach beim Byte Schluss.
Und 35 bzw 53 sind erst mal ALLE BEIDE dezimale Zahlen.
Wenn du 35hex (='5') oder 53dez meinst, dann musst du das unbedingt
deutlich kenntlich machen.
Denn was ist z.B. 11?
Ist das binär 11 (=3) oder dezimal 11 oder hex 11 (=17)?
Draco schrieb:> Ohhh super! Danke, genau das hab ich gesucht :)
Da bin ich mir noch nicht ganz so sicher...
Wofür brauchst du denn diese dezimale Darstellung der einzelnen
Zehnerpotenzen? Für irgend eine Anzeige? Dann wäre die Darstellung im
ASCII-Code üblicher.
Lothar M. schrieb:> Draco schrieb:>> also mein Compiler wandelt da nichts um von Char in uint8> Ist ja zum Glück eh' das Selbe...>>> Char '5' (also 35 bzw 53 bei littleendian)> Little und Big-Endian geht aber nicht bis auf die Nibble-Ebene runter,> sondern es mach beim Byte Schluss.> Und 35 bzw 53 sind erst mal ALLE BEIDE dezimale Zahlen.> Wenn du 35hex (='5') oder 53dez meinst, dann musst du das unbedingt> deutlich kenntlich machen.> Denn was ist z.B. 11?> Ist das binär 11 (=3) oder dezimal 11 oder hex 11 (=17)?>> Draco schrieb:>> Ohhh super! Danke, genau das hab ich gesucht :)> Da bin ich mir noch nicht ganz so sicher...> Wofür brauchst du denn diese dezimale Darstellung der einzelnen> Zehnerpotenzen? Für irgend eine Anzeige? Dann wäre die Darstellung im> ASCII-Code üblicher.
Ja... also um mal weit auszuholen. Der ASCII Code für '5' ist der
Integerwert 53 also als Hexwert die 0x35 und Binär 0b00110101 - so
meinte ich das :)
Ja genau, es ging um das Darstellen auf einer 5er 7-Segment Anzeige mit
einem MC14489 als Treiber. Der will halt die einzelnen Stellen als 4-Bit
Hex haben.
Hab mir dann das so gerade fix zusammengeschrieben und funktioniert nun
super:
Draco schrieb:> Der will halt die einzelnen Stellen als 4-Bit Hex haben.
Dann kannst du es auch "einfach" mit itoa() machen und vor der Ausgabe
bei den einzelnen Zeichen jeweils eine '0' abziehen...
> Hab mir dann das so gerade fix zusammengeschrieben und funktioniert nun> super: ...
Was du da gemacht hast, ist eine "Integer-nach-Packed-BCD" Uwandlung.
Beim "Packed-BCD" sind jeweils in 1 Byte zwei BCD-Zahlen
hineingepackt...
Ja itoa wäre auch ne Möglichkeit gewesen, aber ich arbeite mit nem
Tiny2313, da stören mich schon die Case Anweisungen ganz dolle arg :) -
2kbyte sind schnell voll und itoa schluckt halt auch wahnsinnig viel.
Ja super, danke - funktioniert auch :D
Ich dachte Modulo wirft ein Fehler raus wenn er es nicht mehr durch zehn
teilen kann - aber er teilt ja im Grunde nicht, er zieht ja bloß die
Stelle rüber. Wieder was gelernt ^^
Draco schrieb:> Ich dachte Modulo wirft ein Fehler raus wenn er es nicht mehr durch zehn> teilen kann
Man kann 0 beliebig oft durch irgendwas teilen. Es kommt immer 0 dabei
raus. Und bei einer Division von 0 durch irgendwas ist der Rest immer
0...
Draco schrieb:> Ich dachte Modulo wirft ein Fehler raus wenn er es nicht mehr durch zehn> teilen kann - aber er teilt ja im Grunde nicht, er zieht ja bloß die> Stelle rüber. Wieder was gelernt ^^
Öhm, nein. Modulo gibt einem den ganzzahligen Rest zurück der übrig
bleibt von einer Ganzzahl-Division. Es hindert niemand einen daran auch
5%2 zu schreiben, da wird keine Stelle rüber gezogen.