Hexadezimalzahl -> Dezimalzahl



  • hmmm kaum zu glauben, aber das hat mir schon sehr weiter geholfen.
    zwar weiß ich noch nicht, wie ich das mit der eingabe "schön" lösen soll, aber der rest macht jetzt sinn.

    beim inhalt prüfen. spontan würde ich das mit ner IF abfrage machen:

    if (eing[1] >= 0 and eing[1] <=9 or ein[1]== A or ein[1] ==B or ein[1]==C ...)
    {...}

    gibts da eine elegantere lösung für?

    nochmals danke.



  • Der Inhalt von "eing" (char[] nehm ich mal an) wird nicht 1 sondern '1' sein. Die char Werte kannst du genauso vergleichen wie Zahlen, da sie eigentlich nur Zahlen sind und jeder Buchstabe einer Zahl entspricht(siehe ASCII Tabelle).
    Also

    for(int pos=0...
       if (eing[pos] >= '0' && eing[pos] <='9' ... )// zwischen 'A' und 'F' gehts genauso.
    

    Du verwendest schon C, oder?



  • ohje. mir ist gerade erst aufgefallen, was ich fürn mist ich eben geschrieben hatte, tut mir leid. das is die übermüdung. so langsam klingelts im kopf. die abfragung dürfte jetzt keine probleme mehr machen.vielen vielen dank.,jedoch weiß ich noch nicht genau, wie die eingabe zu realisieren ist.
    ist es möglich, das der benutzer eine ziffer eingibt und dieser wert direkt in ein char feld gespeichert wird? also das nur die letzte ziffer mit "ENTER" bestätigt werden muss?

    achja noch eine frage fällt mir gerade ein. es könnte ja sein, das der benutzer weniger als 8 ziffern eingibt. wie setze ich das um, das die wertigkeiten dann trozdem richtig verteilt werden?
    lass ich jedes mal die länge zählen und mach dann zu jeder erlaubten länge eine IF anweisung, wo die wertigkeiten immer variieren? da gibts doch sicher eine einfachere methode oder ?



  • 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 😞


Anmelden zum Antworten