Konvertieren von Dez zu Binär und Hex mit C!!



  • Hatte bzw Habe das selbe Problem mal das ich eine Hex Zahl die in der eingabe durch ein H vor der Hexzahl angegeben wurde in Dez gewandelt wird und wieder zurückgegeben wird.

    hab das mal so Probiert gehabt:

    // Mein Hex Rechner___
    char * my_hex(char * dez, const char * hex)
    {
    	int stellenwert = 0;
    	double basis = 16;
    	int merk = 0;
    	double erg;
    	for(int i = 0; hex[i] != '\0';i++)
    	{
    
    		if (hex[i] == 'h' || hex[i] == 'H')
    		{
    			int j = i;
    			do
    			{
    				stellenwert = stellenwert + 1;
    				j++;
    
    			}while(isxdigit(hex[j]));
    		}
    
    		//	for(int k = stellenwert; stellenwert >= 0; stellenwert--)
    			//{
    				//if (isdigit(hex[i]))
    				//	merk = hex[i];
    				if (hex[i] == '0')
    					merk = 0;
    				else if (hex[i] == '1')
    					merk = 1;
    				else if (hex[i] == '2')
    					merk = 2;
    				else if (hex[i] == '3')
    					merk = 3;
    				else if (hex[i] == '4')
    					merk = 4;
    				else if (hex[i] == '5')
    					merk = 5;
    				else if (hex[i] == '6')
    					merk = 6;
    				else if (hex[i] == '7')
    					merk = 7;				
    				else if (hex[i] == '8')
    					merk = 8;				
    				else if (hex[i] == '9')
    					merk = 9;
    				else if (hex[i] == 'A' || hex[i] == 'a' )
    					merk = 10;
    				else if (hex[i] == 'B' || hex[i] == 'b' )
    					merk = 11;
    				else if (hex[i] == 'C' || hex[i] == 'c' ) 
    					merk = 12;
    				else if (hex[i] == 'D' || hex[i] == 'd' )
    					merk = 13;
    				else if (hex[i] == 'E' || hex[i] == 'e' )
    					merk = 14;
    				else if (hex[i] == 'F' || hex[i] == 'f' )
    					merk = 15;
    
    				dez[i] = (merk * pow(basis, stellenwert));
    				stellenwert = stellenwert -1;	
    	}
    	return dez;
    }
    

    Funktioniert bei mir noch nicht ganz ich weiß noch nicht ganz woran es liegt aber vielleicht siehst du ja einwenig den möglichen Ablauf vielleicht hilft dir das weiter.

    Oder jemand anderes weiß noch wies besser geht vl auch in Bezug auf meinen Quellcodeausschnitt ein verbesserungsvorschlag :xmas2:

    Also dann

    Frohes schaffen!

    Gruß



  • in Bezug auf meinen Quellcodeausschnitt ein verbesserungsvorschlag

    Wenn Du hinten anfaengst kannst Du auf pow() verzichten und einfach die Basis auf den Stellenwert (initial 1) multiplizieren.

    Da die Ascii-Darstellung der Hexadezimalziffern aufsteigend ist, koennte man die Ziffernumrechnung anstatt der if..else-Konstruktion zb per binaerer Suche loesen:

    char hex2dec(char c)
    {
      char *hexmap="0123456789ABCDEF";
      int l= 0;
      int r= 15;
      int m;
      while (l<r)
      {
        m= (l+r)>>1;
        if (c>hexmap[m])
          l=m+1;
        else
          r=m;
      }
      return l;
    }
    

    (setzt uppercase voraus)



  • Timauchmalloggedoff schrieb:

    itoa() ist kein Standard C.

    dann nimm strol, strtoul oder sowas. irgendwas davon ist 'ne standardfunktion.
    🙂



  • hellihjb schrieb:

    koennte man die Ziffernumrechnung anstatt der if..else-Konstruktion zb per binaerer Suche loesen:

    bist du informatiker oder sowas? ein 'if' ist doch nicht schlecht:

    char hex2dec(char c)
    {
      c = toupper(c) - '0';
      if (c <= 9)
        return c;  
      return c + '0' - 'A' + 10;
    }
    

    🙂



  • ~fricky schrieb:

    Timauchmalloggedoff schrieb:

    itoa() ist kein Standard C.

    dann nimm strol, strtoul oder sowas. irgendwas davon ist 'ne standardfunktion.
    🙂

    Ja, aber das wären Alternativen zu atoi, nicht itoa...



  • _matze schrieb:

    Ja, aber das wären Alternativen zu atoi, nicht itoa...

    ach, ich blindfisch! na, dann eben 'sprintf'.
    🙂



  • ~fricky schrieb:

    _matze schrieb:

    Ja, aber das wären Alternativen zu atoi, nicht itoa...

    ach, ich blindfisch! na, dann eben 'sprintf'.
    🙂

    Richtig, du Blindfisch! 😃 😉

    Und wie wandelt man nach binär um mit sprintf?



  • _matze schrieb:

    Richtig, du Blindfisch!

    ich muss zugeben, dass ich den thread nur stückchenweise gelesen habe.
    🙂



  • Ninja also bei meinem Code Beispiel war wie ich jetzt weiß diese Stelle Falsch (Denkfehler zu einfach gedacht):

    dez[i] = (merk * pow(basis, stellenwert));
    

    ich muss das Erg mit dem nächsten Addieren und dem nächsten dazu und so weiter... und dann das gesammtergebniss in dez[i] position für Postition packen...

    ansonsten der Vorgang die Rechnung bis dahin ist nicht falsch...

    gruß



  • noch ne Frage ... also es gibt ja isxdigit und so... damit überprüfe ich auf 0-9 A-F so nun soll bei HExa wenn ein G-Z eingegeben wurde ein Fehler kommen... gibt es sowas wie isnotxdigit oder so? ^^



  • Virokams schrieb:

    noch ne Frage ... also es gibt ja isxdigit und so... gibt es sowas wie isnotxdigit oder so? ^^

    lies deine frage mal selbst, dann weisst du gleich die antwort.
    🙂



  • ~fricky schrieb:

    Virokams schrieb:

    noch ne Frage ... also es gibt ja isxdigit und so... gibt es sowas wie isnotxdigit oder so? ^^

    lies deine frage mal selbst, dann weisst du gleich die antwort.
    🙂

    !isdigit als Beispiel? XD

    Ich hammel... sry


Anmelden zum Antworten