C dez in hex umrechnen

Danny787

Ensign
Registriert
Jan. 2007
Beiträge
180
Ich habe eine Funktion programmiert, welche eine beliebige Dezimalzahl in eine Hexadezimal umrechnet, die jeweiligen Reste werden in einem char Array abgespeichert. Jetzt steh ich jedoch vor dem Problem, dass ich dieses Array nicht richtig auf der Konsole ausgeben kann, da es sowohl Integer als auch Character Elemente beinhaltet.
Hier erstmal die Funktion:

int dez_hex (int dez, char *line){
int nz;
int nergebnis;
int nmodulo;


if (dez < 0 || dez > 65535){
return (1);
}
else {for (nz = 0; nz < 16 ; nz++){

nmodulo = dez % 16;
switch (nmodulo){
case 10: nmodulo = 'A';break;
case 11: nmodulo = 'B';break;
case 12: nmodulo = 'C';break;
case 13: nmodulo = 'D';break;
case 14: nmodulo = 'E';break;
case 15: nmodulo = 'F';break;
}

line[nz]= nmodulo;
nergebnis = dez / 16;
dez = nergebnis;



}
return 0;
}
}

Die Funktion wird in der Main aufgerufen und soll dort dann das Array ausgeben (array ist in main angelegt, von welchem die referenz der Funktion übergeben wird), doch weder mit %s oder einer for-schleife und %d oder %c wird die zahl korrekt ausgegeben, was auch logisch, da die elemente des typs char sowie integer entsprechen.

Meine Frage ist nun, ob dieser Ansatz überhaupts zu gebrauchen ist, oder muss ich das ganze komplett anders angehen?

p.s. ja ich weiß, dass die elemente noch verkehrt herum im array drin sind, die reste müssen auch noch verkehrt herum ausgegeben werden, dies wollte ich mit einer for schleife in der main regeln, welche die elemente dann richtig rum ausgibt.
 
Um auch die Zahlen als ASCII-Zeichen zu erhalten kannst du einfach das ASCII-Zeichen für die Null nehmen und die entsprechende Zahl addieren, das müsste funktionieren, weil du ja nur die Ziffer 0-9 hast und keine größeren Zahlen.
Dann einfach noch eine if-Abfrage ob eine ASCII-Zahl oder ein Buchstabe in das Array geschrieben werden soll und schon sollte das Ganze funktionieren.

Gruß
BlackMark
 
der ansatz ist nicht zu gebrauchen. so funktioniert das nicht ;)

hat es einen bestimmten grund, warum du diese funktion selbst implementieren willst?

s(n)printf kann das auch lösen..
snprintf(buffer, sizeof(buffer), "%x", dez);

-> http://linux.die.net/man/3/snprintf
 
hier mal eine Möglichkeit die Sache an zu gehen:
Code:
/* return: pointer to first non zero digit in buffer */
char* ui2hex(unsigned int uiValue,char* pszBuffer)
{
	int i=sizeof(uiValue)*2,k=sizeof(uiValue)*2-1;
	unsigned int chr;

	pszBuffer[i]=0;

	for(i--;i>=0;i--)
	{
		chr     = uiValue&0xf;  // = uiValue%16
		uiValue = uiValue>>4;	// = uiValue/16
		pszBuffer[i] = (char) ( (chr>9) ? chr+0x37 : chr+0x30 );
		if(chr)
			k=i;
	}

	return &pszBuffer[k];
}

Bsp:

Code:
	char buf[9];
	unsigned int value=0x1234ef;
	...
	/* alle Ziffern */
	ui2hex(value,&buf[0]);
	printf("%s\n",&buf[0]);	
	
	/* ohne führende Null-Ziffern */
	printf("%s",ui2hex(value,&buf[0]));
 
Zuletzt bearbeitet:
der ansatz ist nicht zu gebrauchen. so funktioniert das nicht
Funktionieren tut es schon, das Array ist zwar etwas seltsam aufgebaut, aber im Prinzip bekommt man die richtige hexadezimale Zahl.
Jedoch ist die Version von Woey weitaus effizienter und sicherlich zu bevorzugen, aber doch nicht so einfach nachvollziehbar.

@DBinder: Warum verwendest du nicht die printf Funktion, so wie es IceMatrix auch vorgeschlagen hat?
Wenn es dir nur um die Ausgabe einer Zahl als Hexadezimale geht, wäre die printf Funktion doch genau das Richtige.

Gruß
BlackMark
 
Meine Implementation 'tohex'

Code:
char* tohex(char* dst, const void* bin, int size) {
	const char* hex = "0123456789abcdef";
	const unsigned char* data = (const unsigned char*)bin;
	int i,p=0;
	
	for (i=0; i<size; i++) {
		
		// highest order nibble (4 bits)
		dst[p] = hex[data[i]>>4];
		p++;
		
		// lowest order nibble (4 bits)
		dst[p] = hex[data[i]&0x0f];
		p++;
		
	}
	
	dst[p] = 0;
	
	return dst;
}
 
Zurück
Oben