Hexadezimalzahl -> Dezimalzahl



  • Nachrichtentext: schrieb:

    Du verwendest schon C, oder?

    ich glaub' das machen fast alle in diesem unterforum 😉

    @OP
    man könnte auch sowas machen (für jedes zeichen)

    ...
            if (c > '9')
                c = (c&0xdf) - 'A' + 10;  // buchstaben ergeben 10...X
            else
                c -= '0';                 // zahlen ergeben 0...9
            if (c > 15)
            {
                // fehleingabe
            }
            else
            {
                // okay (0<=c<=15)
            }
    ...
    

    kann beides, gross- und kleinbuchstaben verarbeiten. in c steht dann 0 für '0' bis 15 für 'f' bzw. 'F'



  • ich glaube er hat sich gewundert warum ich AND und OR geschrieben habe 😃
    naja wie gesagt. zu viel arbeit zu wenig zeit das führt zu wenig schlaf und "dummen einträgen" 🙄

    hm verstehe dein code leider nicht ganz.
    könntest du das näher erleutern, was was ist?

    if (c > '9')
                c = (c&0xdf) - 'A' + 10;  // buchstaben ergeben 10...X
            else
                c -= '0';
    

    besonders:

    (c&0xdf)
    

    und

    c -= '0'
    


  • tim-buktu schrieb:

    besonders:

    (c&0xdf)
    

    damit wird das bit 5 ausgeblendet und dann hat man immer grossbuchstaben.

    tim-buktu schrieb:

    und

    c -= '0'
    

    das macht aus den ascii-zeichen '0' bis '9' zahlenwerte (0 bis 9)



  • hmmm nur mal so ob ichs verstanden hab.
    für 11 wäre der code dann folgender:

    ...
    if (c > '9')
                c = (c&0xdf) - 'B' + 11;  
            else
                c -= '0'; 
    ...
    

    c ist vom typ char oder ?

    hättest du vielleicht ein etwas längeres beispiel, denn irgend wie blick ich immer noch nicht ganz durch... bin was neben der spur im moment, sorry.

    achja, das problem mit der eingabe ist auch noch da. also die realisierung von der wertigkeitvergabe. ich wüsste nur, wie ichs machen könnte, wenn der benutzer IMMER 8 ziffern eingibt. zu meinem nachteil soll er jedoch auch weniger eingeben können.



  • tim-buktu schrieb:

    hmmm nur mal so ob ichs verstanden hab.
    für 11 wäre der code dann folgender:

    nee, hast es leider nicht verstanden...
    'c' ist die variable, der code bleibt unverändert.
    wenn vorher c=='B' dann nachher c==11
    :xmas2:



  • okay. ich stell mich mal in die ecke:D
    kannst du mir noch erklären, was das (

    - 'A' + 10
    

    ) genau bewirkt und warum? für die ganz doofen wie mich halt 🙄 😞

    gut. bin eben von der arbeit gekommen, werd jetzt mal anfangen. weiß jedoch noch nicht wie das mit der wertigkeitverteilung umzusetzen ist. wenn man immer 8 ziffern eingibt, dann ists ja kein problem, aber bisher ist mir noch kein lich aufgegangen, wie es bei variabler anzahl funktionieren soll. 🙄



  • c = (c&0xdf) - 'A' + 10;
    

    (c&0xdf) wandelt kleinbuchstaben wie 'a', 'h' usw. in großbuchstaben 'A', 'H' usw. um.
    -'A' + 10 wandelt die zahl in dezimal um.
    -'A' zieht erstmal von c den ascii-wert von 'A' ab. +10 kommt daher, weil 0-9 schon durch die abfrage vorher abgedeckt ist(if c > '9') und dann somit z.B. A, 10 ist.
    Bsp.
    'C' - 'A' == 2
    2+10==12

    ps. sorry wenns nich gut formuliert ist, ist halt schon bisschen spät 🙄



  • alles klar. ich habs verstanden. wäre ich nich drauf gekommen.
    so füße sind hochgelegt, kaffee steht aufm schreibtisch, jetzt kanns losgehen.
    hmmm aber mit den wertigkeiten is mir immer noch nichts eingefallen. da brauch ich auf jedenfall noch hilfe, wenns möglich ist.



  • du meinst das mit der variablen anzahl ziffern?
    wie wärs den mit einer variabel, die bei jeder neuen ziffer hochgezählt wird? (do-while schleife z.B.)



  • hatte ich auch schon dran gedacht.
    das es 8 unterschiedliche fälle gibt. also wenn zählervariable 1 ist, dann wertigkeit 16^0 wenn 2 dann erste zahl 16^1 und zweite zahl 16^0... so meinst du das doch oder ?
    gibt es da noch eine elegantere lösung?



  • 3F = 3 * 16^1 + F *16^0
    Du musst also von hinten mit 0 anfangen, egal wie lang der text ist.



  • BuddyHolly schrieb:

    3F = 3 * 16^1 + F *16^0
    Du musst also von hinten mit 0 anfangen, egal wie lang der text ist.

    ausgehend von dem code weiter oben:

    unsigned long hexstring_to_number (char *str)
    {
        unsigned long res = 0;
        while (*str)
        {
            char c = *str++;
    
            if (c > '9')
                c = (c&0xdf) - 'A' + 10;  // buchstaben ergeben 10...X
            else
                c -= '0';                 // zahlen ergeben 0...9
            if (c > 15)
            {
                // fehleingabe
                // muss irgendwie behandelt werden
            }
            else
            {
                // okay (0<=c<=15)
                res = (res<<4) + c;
            } 
        }
        return res;
    }
    


  • ich hab mal wieder was nich ganz verstanden.🙄
    was bewirkt die variable res ?
    und warum wird sie um 4 bit nach links verschoben?



  • tim-buktu schrieb:

    ich hab mal wieder was nich ganz verstanden.🙄
    was bewirkt die variable res ?
    und warum wird sie um 4 bit nach links verschoben?

    jede hexziffer steht für 4 bits (0x0 == 0000, 0xf == 1111).
    'res' akkumuliert diese bits. für jede neue ziffer (eine stelle mehr) wird res erstmal 4 mal links geschoben (entspricht einer multiplikation mit 16) und dann kommen die neuen 4 bits an die frei gewordenen stellen...
    :xmas2:

    testing...



  • tim-buktu schrieb:

    ich hab mal wieder was nich ganz verstanden.🙄
    was bewirkt die variable res ?
    und warum wird sie um 4 bit nach links verschoben?

    Egal. Machst doch ganz einfach

    summe = 0
    Text von hinten her durchgehen {
      wenn textzeichen bei aktueller position zwischen '0' und '9'
       summe += (textzeichen bei aktueller position - '0') * 16^(länge-position)
      sonst das selbe mit 'a' bis 'f'
    }
    

    Dann brauchst du auch nix schieben.



  • ten schrieb:

    res = (res<<4) + c;
    

    Mach doch aus dem + noch ein | dann wirds noch elitärer 😉



  • TactX schrieb:

    ten schrieb:

    res = (res<<4) + c;
    

    Mach doch aus dem + noch ein | dann wirds noch elitärer 😉

    stimmt. grundrechenarten und bitoperationen gemischt sieht doof aus 😞



  • ah, super, ich glaub ich hab beides jetzt verstanden,
    werde aber erst einmal das umsetzen:

    summe = 0
    Text von hinten her durchgehen {
      wenn textzeichen bei aktueller position zwischen '0' und '9'
       summe += (textzeichen bei aktueller position - '0') * 16^(länge-position)
      sonst das selbe mit 'a' bis 'f'
    }
    

    und wenn das super geklappt hat und ich noch zeit habe,mach ich mich an die meiner meinung nach kompliziertere variante 🙂
    bin mal gespannt ob ich morgen vormittag genug zeit dafür habe. hab mich in das thema zeiger noch nicht so ganz reingelesen, deshalb könnte es sein, das ich diesbezüglich ein paar schwierigkeiten bekomme und mich noch mal melde, ansonsten schon mal vielen vielen dank !



  • char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'};
    int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15};
    
    char hex[256] = "ffffffff";
    int zahl = 0;
    
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 24; j++)
                if (hex[i] == hextab[j])
                {
                    zahl <<= 4;
                    zahl |= dectab[j];
                    break;
                }
             printf("Fehler in Hexzahl!");
             break;
        }
    

    :xmas1: 🕶



  • verfluchte fehler

    char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'};
    int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15};
    
    char hex[256] = "ffffffff";
    int zahl = 0;
    
        for (int i = 0, j; i < 8; i++)
        {
    
            for (j = 0; j < 24; j++)
            {
                if (hex[i] == hextab[j])
                {
                    zahl <<= 4;
                    zahl |= dectab[j];
                    break;
    
                }
            }
            if (hex[i] != hextab[j])
            {            
                printf("Fehler in Hexzahl!");
                break;
            }
        }
    

    😃


Anmelden zum Antworten