www.mikrocontroller.net

Forum: PC-Programmierung Hex Wert als Hex Wert ausgeben


Autor: Simon Hauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe folgendes, für Euch wahrscheinlich triviales Problem.
Und zwar habe ich einen Hex Wert den ich über eine serielle 
Schnittstelle an einer Konsolo ausgebe. Der Wert wird mir da natürlich 
als ASCII Zeichen interpretiert und auch als solches ausgegeben.
Wie ist es möglich dass ich mir den Hex-Wert ausgeben lassen kann?

Gruß

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es fängt schon mal damit an, daß Du gar keinen Hex-Wert hast, sondern 
einfach nur eine Zahl.
Ob Hex, ob Dezimal oder Oktal, das ist alles nur eine Darstellungssache, 
die Zahl selbst interessiert sich nicht dafür.

Und diese Zahl willst Du in Klartext umwandeln, und zwar so, daß sie in 
hexadezimaler Darstellung vorliegt.

Da Du praktischerweise kein Wort über die von Dir verwendete 
Programmiersprache verloren hast, gehe ich jetzt einfach mal von C aus.

Und da gibt es das mächtige printf, das mit dem Formatspezifizierer %x 
bzw. %X daherkommt. Bei gewünschter Ausgabe von führenden Nullen ist 
noch eine Null und die Feldbreite anzugeben, also z.B. %04x für 
vierstellige Zahlen.

Autor: Simon Hauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, stimmt, habe mich etwas undeutlich ausgedrückt:-)

Ich benutze C++.
Printf steht mir nicht zur Verfügung. Auch die stdlib.h kann ich nicht 
verwenden (also kein itoa), sodass ich eine andere Möglichkeit 
benötige....

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>sodass ich eine andere Möglichkeit benötige....

Selber basteln?
Man nehme einen String, ein paar Schleifen und Abfragen, und schon ist 
ITOA selber gebastelt.

Autor: Captain Subtext (captainsubtext)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ungefähr so, allerdings ist das jetzt aus dem Kopf und vielleicht ist da 
ein Bug drin. Aber vom Prinzip her sollte es klappen:
unsigned char nibble_zu_hex(unsigned char nib) {
 if (nib < 0x0A) nib = nib + '0';
 else nib = (nib - 0x0A) + 'A'
 return nib;
}

nibble_zu_hex(zahl >> 4);
//liefert Dir den vorderen Buchstaben

nibble_zu_hex(zahl & 0x0F);
//liefert Dir den hinteren Buchstaben

//Annahme: UART_send ist Deine Funktion, um ein char zu senden
UART_send("0");
UART_send("x");
UART_send(nibble_zu_hex(zahl >> 4));
UART_send((zahl & 0x0F));
}

Ich hoffe, Du verstehst die Grundidee dahinter, dann kannst Du das auch 
auf Integer, long long Longs usw. anwenden :)

Im Prinzip musst Du nur den Zahlenwert der Ziffer kennen (4 Bit 
entsprechen einer Hex-Ziffer), und dann das entsprechende ASCII-Zeichen 
stattdessen nutzen. Ich addiere einfach die entsprechenden Werte (einmal 
für 0-9, einmal für A-F).

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon Hauer schrieb:
> Ich benutze C++.

String-streams

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für AVR's: Wie wärs mit Assembler ?
; 
************************************************************************
; bin2ascii R16 Hexaziffer binär nach ASCII umwandeln
bin2ascii:
        andi    r16,$0f     ; Maske 0000 1111
        subi    r16,-0x30   ; ADDI  r16,+$0x30 codieren
        cpi     r16,'9'+1   ; Ziffern 0..9 ?
        brlo    bin2ascii1  ;   ja: weiter
        subi    r16,-7      ; nein: ADDI r16,+7 Buchstaben A .. F
bin2ascii1:
        ret                 ; Rücksprung

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du mit cout arbeitest, dann hilft

cout << hex; //schaltet auf hexadezimale Zahlendarstellung um

;-)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich benutze C++.
> Printf steht mir nicht zur Verfügung.

Warum?

> Auch die stdlib.h kann ich nicht verwenden (also kein itoa),

Warum?

Autor: Simon Hauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Euch allen für die sehr hilfreichen Antworten.

Habe mir jetzt auf eine nicht besonders schöne aber durchaus brauchbare 
"Abfragenbatterie" :-) eine itoa programmiert.

VG

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>"Abfragenbatterie"

Lass mal sehen!

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Captain Subtext schrieb:
>
> unsigned char nibble_zu_hex(unsigned char nib) {
>  if (nib < 0x0A) nib = nib + '0';
>  else nib = (nib - 0x0A) + 'A'
/*                         ^^^^^ sollte +'0' heißen, oder? */
>  return nib;
> }
> 

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> /*                         ^^^^^ sollte +'0' heißen, oder? */

Nein.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wobei das auch mit weniger Code geht:
  return "01234567890ABCDEF"[nib];

und sich dafür wiederum gar kein echter Funktionsaufruf lohnt...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wobei das auch mit weniger Code geht:
>  return "01234567890ABCDEF"[nib];
                     ^
                 Das gehört da aber nicht hin.

Daraus würde ich zur Sicherheit das machen:
  return "0123456789ABCDEF"[nib & 0xf];

Letztendlich ist auch das da:

>  else nib = (nib - 0x0A) + 'A'

eigentlich nicht so ganz portabel, da nicht garantiert ist, daß die 
Zeichen 'A' bis 'F' hintereinander stehen. Da aber die meisten 
C-Compiler ASCII als Basis für ihre Zeichensätze benutzen, geht's 
normalerweise.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
>> wobei das auch mit weniger Code geht:
>>  return "01234567890ABCDEF"[nib];
>                      ^
>                  Das gehört da aber nicht hin.

klar, mein Fehler.

>
> Daraus würde ich zur Sicherheit das machen:
>
>
>   return "0123456789ABCDEF"[nib & 0xf];
> 

So wie er es verwendet, maskiert er vorher so, daß nur 4 Bit
vorhanden sein können.
Insofern hätte ich hier keine Bedenken.
Als allgemeingültige Funktion gebe ich dir Recht. Ob man in
diesem Fall die hier unnötigen Tests machen will, muß jeder
selbst sehen.


>
> Letztendlich ist auch das da:
>
>>  else nib = (nib - 0x0A) + 'A'
>
> eigentlich nicht so ganz portabel, da nicht garantiert ist, daß die
> Zeichen 'A' bis 'F' hintereinander stehen. Da aber die meisten
> C-Compiler ASCII als Basis für ihre Zeichensätze benutzen, geht's
> normalerweise.

Wieso "auch"? Meine Version ist portabel.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wieso "auch"? Meine Version ist portabel.

Mit "auch" meinte ich hier, daß das "auch" ein Grund ist, deine Version 
zu verwenden.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Da aber die meisten C-Compiler ASCII als Basis für ihre
> Zeichensätze benutzen, geht's normalerweise.

Hat schon mal jemand von einem auch nur gehört, der das nicht tut?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich gehe mal davon aus, daß man auf IBM-Mainframes nicht
ASCII findet, sondern EBCDIC.
Da sind dann nicht alle Buchstaben A bis Z aufeinanderfolgend,
aber immerhin A bis F und auch die Ziffern.
Der obige Code würde also auch dort funktionieren.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ernsthaft: Glaubst Du ernsthaft, daß es diese 60er-Jahre-Technik 
immer noch gibt?

(Ansonsten hast Du natürlich recht, der Ansatz ist der "portabelste").

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mal ernsthaft: Glaubst Du ernsthaft, daß es diese 60er-Jahre-Technik
> immer noch gibt?

ASCII ist auch "60er-Jahre-Technik".

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rufus: meines Wissens sind bei Banken immer noch solche Kisten
im Betrieb.
Zumindest war das vor wenigen Jahren so und ich habe nichts
gegenteiliges gehört.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.