Integerzahl in Hexadezimalzahl umwandeln

Will man Hex-Zahlen ausgeben, muss man dazu den meist zugrundeliegenden Integer erst in einen String bestehend aus Hex-Ziffern umwandeln, den man schließlich ausgeben kann. Zur Umwandlung von Integer-Werten in Hexa gibt es einige Lösungen, oftmals sind auch schon welche in die heutigen Entwicklungsumgebungen integriert. Da ich gerade jedoch eine spezielle Variante benötigte, habe ich damit ein wenig herumexperimentiert und einige Ergebnisse gibt es im Folgenden.

Variablendeklaration

string s1;  // Ergebnis
int i; // umzuwandelnde Zahl

C# Standardverfahren zur Umwandlung von Integer in Hexa

s1 = i.ToString("X2");

C# Spezielle Int2Hex-Varianten mit neuen Funktionen

public char  GetHexaDigit(int nr, int pos){
///\brief liefert eine einzelne Hex-Ziffer zurück
///\param nr = umzuwandelnde Zahl
///\param pos = die Position der gewünschten Hex-Ziffer von nr
///\returns die Hex-Ziffer als char 
 
 int i=0;
 
 switch(pos){
  case 0:
   i=nr&0x000F;
   break;
  case 1:
   i=(nr>>4)&0x000F;
   break;
  case 2:
   i=(nr>>8)&0x000F;
   break;
  case 3:
   i=(nr>>12)&0x000F;
   break;
 }   
 if(i>9)i+=55;else i+=48;
 return (char)i;
}
 
public string GetHexaNumber(int nr, int anz){ // anz von 1..4
///\brief liefert die Hex-Zahl zurück
///\param nr = umzuwandelnde Zahl
///\param anz = Anzahl der gewünschten Hex-Ziffer von nr; nur niederwertige 16 Bit, also 1..4 zulässig
///\returns die Hex-Zahl als string
 
 int i=0;
 string s1="";
 
 i=nr&0x000F;
 if(i>9)i+=55;else i+=48;
 s1=(char)i+s1;
 
 if(anz>1){
  nr>>=4;
  i=nr&0x000F;
  if(i>9)i+=55;else i+=48;
  s1=(char)i+s1;
  if(anz>2){
   nr>>=4;
   i=nr&0x000F;
   if(i>9)i+=55;else i+=48;
   s1=(char)i+s1;
   if(anz>3){
    nr>>=4;
    i=nr&0x000F;
    if(i>9)i+=55;else i+=48;
    s1=(char)i+s1;
   }
  }
 }
 return s1;
}
 
s1 = GetHexaNumber(i,2);

Bei Gelegenheit mache ich vielleicht noch eine Geschwindigkeitsanalyse meiner neuen Routinen gegenüber der in Visual C# integrierten Variante. Vermutlich ist die integrierte in den meisten Fällen schneller.

Eigentlich brauchte ich den Spaß heute für einen Microcontroller, also in C, aber irgendwie wollte die vorhandene itoa-Funktion nicht so ganz wie ich wollte. Deshalb entstand der obige Versuch mit C# und daraus die folgende simple C-Variante ohne Funktion drumherum.

C Einfache Umwandlung Int2Hex

char s1[4];
uint8_t h;
 
h=crc_sender>>12;
if(h>9)s1[3]=h+54;else s1[3]=h+48;
 
h=(crc_sender>>8)&0x0F;
if(h>9)s1[2]=h+54;else s1[2]=h+48;
 
h=(crc_sender>>4)&0x0F;
if(h>9)s1[1]=h+54;else s1[1]=h+48;
 
h=crc_sender&0x0F;
if(h>9)s1[0]=h+54;else s1[0]=h+48;

Jetzt muss man s1 nur noch ausgeben, evtl. in andere Reihenfolge, je nach Bedarf und verwendetem System.

Einen Kommentar schreiben