# HEX nach ASCII konvertieren



## Sotares (29. Juni 2004)

Guten Tag allerseits.

Wie kann ich unter C einen Hexadezimalwert nach ASCII konvertieren?
z.B: FF = 255 soll ergeben

Umgekehrt scheint es ja zu gehen:

```
unsigned char h={255};                
printf("%X",h);
```

Danke und Gruss,
Sotares


----------



## Trent (29. Juni 2004)

Hex nach ascii geht nicht weil Hex ist ein mathematisches System und ASCII ist ein Zeichensatz. Dein Beispiel erfordert die umwandlung von Hexadezimalsystem nach Dezimalsystem. Dazu gibts viele möglichkeiten das umzurechnen.
Benutz einfach mal die Suchen Funktion, wenn ich das richtig gesehen hab gabs dazu nämlich hier schon ein paar programme


----------



## Sotares (29. Juni 2004)

Natürlich Dezimalsystem und nicht ASCII.
Wo hab ich nun meinen Kopf auch wieder!

Leider konnte mir die Suchfunktion nicht weiterhelfen da ich weder mit hex oder dezimal etwas gefunden habe.

Sotares


----------



## Dudadida (29. Juni 2004)

Vielleicht nicht der beste Algorithmus, aber mehr ist mir eben nicht eingefallen :

```
//Zahl zum Umwandeln
  int zahl = 256;

  //Ergebnisstring
  char hexstring[20];

  //Algorithmus

  //Hilfsvariablen
  char tempstring[20];
  int temp = zahl;
  memset(tempstring,0,20);    
  char hexbytes[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

  for (int i = 0;;i++)
  {
    if (temp == 0) break;
    tempstring[i] = hexbytes[temp%16];    
    temp /= 16;
  }

  //String umdrehen
  for (int i = 0; i < strlen(tempstring); i++)
  {
    hexstring[i] = tempstring[strlen(tempstring)-i-1];
  }
  hexstring[strlen(tempstring)] = 0;

  //fertig

  printf("%i wird zu 0x%s\n",zahl,hexstring);
```


----------



## Dudadida (30. Juni 2004)

Ich merke hier gerade, dass ich das Thema verfehlt habe. Hab genau das Gegenteil gepostet... sorry.


----------



## squeaker (30. Juni 2004)

mir ist das ganze noch nicht klar - sollen Stringräpresentationen ineinander umgewandelt werden? Oder soll eine int in Hex nach einer int in dezimal umgewandelt werden?

Falls String:
- Eingabeformat: 
- Ausgabeformat:


----------



## Sotares (30. Juni 2004)

Habe letzte Nacht was zusammengebastelt, nachdem ich hier 
nachgelesen habe, nach welchen mathematischen Regeln das Hexadezimalsystem aufgebaut ist.




```
#include <stdio.h>
#include <stdlib.h>

int main()
{

char hex[]="FF";


int hex_t1=0, hex_t2=0, hex_to_dez=0, zahl1=0;


if(hex[0]>=65 && hex[0]<=70)
{
    switch(hex[0])
      {
      case 65: hex_t1=10;
      break;
      case 66: hex_t1=11;
      break;
      case 67: hex_t1=12;
      break;
      case 68: hex_t1=13;
      break;
      case 69: hex_t1=14;
      break;
      case 70: hex_t1=15;
      break;
      }    
    
} 

else
{
switch(hex[0])
      {
      case 48: hex_t1=0;
      break;
      case 49: hex_t1=1;
      break;
      case 50: hex_t1=2;
      break;
      case 51: hex_t1=3;
      break;
      case 52: hex_t1=4;
      break;
      case 53: hex_t1=5;
      break;
      case 54: hex_t1=6;
      break;
      case 55: hex_t1=7;
      break;
      case 56: hex_t1=8;
      break;
      case 57: hex_t1=9;
      break;
      }    
}    






if(hex[1]>=65 && hex[1]<=70)
{
    
switch(hex[1])
      {
      case 65: hex_t2=10;
      break;
      case 66: hex_t2=11;
      break;
      case 67: hex_t2=12;
      break;
      case 68: hex_t2=13;
      break;
      case 69: hex_t2=14;
      break;
      case 70: hex_t2=15;
      break;
      }    

}    

else
{
switch(hex[1])
      {
      case 48: hex_t2=0;
      break;
      case 49: hex_t2=1;
      break;
      case 50: hex_t2=2;
      break;
      case 51: hex_t2=3;
      break;
      case 52: hex_t2=4;
      break;
      case 53: hex_t2=5;
      break;
      case 54: hex_t2=6;
      break;
      case 55: hex_t2=7;
      break;
      case 56: hex_t2=8;
      break;
      case 57: hex_t2=9;
      break;
      }    
}    




hex_to_dez=((hex_t1 * 16)+ hex_t2);
printf("%d\n", hex_to_dez);



  system("PAUSE");	
  return 0;
}
```

Nun, ich wollte eigentlich bei den "else" Abfragen ein atoi machen statt dem switch konstrukt, um das char in ein int zu konvertieren.
Leider schmiert mir das Programm ab, vermutlich lässt sich ein atoi nicht auf einen teil des arrays anwenden. (Newbie Fehler?)


```
zahl1=atoi(hex[0]);
```

Hingegen:

```
zahl1=atoi(hex);
```
funktioniert.

Grüsse,
Sotares


----------



## squeaker (30. Juni 2004)

atoi erwartet einen pointer - hex[0] ist ein char, hex ein char*.

Ein paar strukturelle vorschläge:

Mach dir doch eine Prozedur

int hexToInt (char c) {
  switch (c) {
  case "0": return 0;
  case "1": return 1;
  ...
  default: return -1;
}

damit bekommst du aus jedem einzelnen char eine int. Zusammensetzen ist dann einfach:

int zahl=hexToInt(hex[1])*16+hexToInt(hex[0]);

oder du nimmst einfach:

http://www.mkssoftware.com/docs/man3/strtol.3.asp

Basis auf 16 stellen und fertig.

P.S: Google ist dein Freund. Rede mit ihm, frag ihn Sachen. Er wird es dir Danken.


----------



## Sotares (30. Juni 2004)

Danke, gute Sache mit der Prozedur 



```
#include <stdio.h>
#include <stdlib.h>

int main()
{

char hex[]="FF";
int HexToDez=0;



int HexToInt(char c) 
{
    switch (c) 
    {
    case 48: return 0;
    case 49: return 1;
    case 50: return 2;
    case 51: return 3;
    case 52: return 4;
    case 53: return 5;
    case 54: return 6;
    case 55: return 7;
    case 56: return 8;
    case 57: return 9;
    case 65: return 10;
    case 66: return 11;
    case 67: return 12;
    case 68: return 13;
    case 69: return 14;
    case 70: return 15;    
    case 97: return 10;
    case 98: return 11;
    case 99: return 12;
    case 100: return 13;
    case 101: return 14;
    case 102: return 15;
    
    }
}




HexToDez=(HexToInt(hex[0])*16+HexToInt(hex[1]));
printf("%d\n", HexToDez);


  system("PAUSE");	
  return 0;
}
```


P.S: Ich bin schon fast mit Google verheiratet!

- Sotares


----------



## Dudadida (30. Juni 2004)

würde das 

```
HexToDez=(HexToInt(hex[0])*16+HexToInt(hex[1]));
```

noch zu dem abändern, damit du nicht nur auf 2 stellige Zahlen beschränkt bist:

```
HexToDez = 0;
for (int i = 0; i < strlen(hex); i++)
{
  HexToDez = HexToDez*16+HexToInt(hex[i]);
}
```


----------



## frager (30. Juni 2004)

oder so:

```
char *HexToDec(const char *quellstr, char *zstr)
{
	char mask = ~0xF; // = ~15 = 11110000
	int i, len = strlen(quellstr);
	long ergebnis = 0;

	for(i = 0; i < len; i++)
		ergebnis = ((ergebnis << 4) & mask) | HexToInt(quellstr[i]);

	sprintf(zstr, "%ld", ergebnis);

	return zstr;
}
```
(*) << 4: Ich weiß nicht ob beim left-shift mit nullen aufgefüllt wird
Weiß das zufällig jemand?
---
Ich weiß nicht ob diese Funktion schneller ist als deine, aber sie ist auf jeden fall kürzer  

```
char HexToInt(char c)
{
	if(c >= '0' && c <= '9')
		return (c - '0');
	if(c >= 'a' && c <= 'f')
		return (c - 'a' + 10);
	if(c >= 'A' && c <= 'F')
		return (c - 'A' + 10);

	return 0;
}
```


----------



## Dudadida (30. Juni 2004)

> _Original geschrieben von frager _
> *
> (*) << 4: Ich weiß nicht ob beim left-shift mit nullen aufgefüllt wird
> Weiß das zufällig jemand?
> *



Jo, wird mit 0 ausgefüllt.


----------



## rockbaer (30. Juni 2004)

Hexstring nach int kannst du auch mit sscanf erledigen :


```
#include <stdio.h>
#include <string.h>

int main(void)
{
	char hexzahl1[] = "FF";
	char hexzahl2[] = "54AB";
	char hexzahl3[] = "D4122EAB";

	unsigned int test;

	sscanf(hexzahl1, "%02X", &test);
	//verifiziere
	printf("hexzahl 1 in unsigned int = %lu\n\n", test);

	sscanf(hexzahl2, "%04X", &test);
	//verifiziere
	printf("hexzahl 2 in unsigned int = %lu\n\n", test);

	sscanf(hexzahl3, "%08X", &test);
	//verifiziere
	printf("hexzahl 3 in unsigned int = %lu\n\n", test);

	system("PAUSE");

	return 0;
}
```


----------



## Sotares (1. Juli 2004)

*Danke...*

...für die zahlreichen Beispiele!

Da ich noch nicht lange mit C arbeite, sehe an vielen stellen vor lauter Bäumen den Wald nicht. (Pointer zeigen mir den Weg aus dem Wald - hahaha!)

- Sotares, der im Wald Beeren pflückt.


----------



## squeaker (1. Juli 2004)

*Re: Danke...*



> _Original geschrieben von Sotares _
> *...für die zahlreichen Beispiele!
> 
> Da ich noch nicht lange mit C arbeite, sehe an vielen stellen vor lauter Bäumen den Wald nicht. (Pointer zeigen mir den Weg aus dem Wald - hahaha!)
> *



Nicht aus - nur rein.


----------

