char zu hex konvertieren



  • erstmal danke für die schnellen antworten

    Artchi schrieb:

    Es gibt in den Stream Manipulatoren, mit denen du die Formatierung umschalten kannst.

    Beispiel:

    cout << hex << 10;
    

    Ergibt auf der Konsole 0A. Das ganze kannst du mit allen Streams machen, mußt du in deinem Fall mit einem stringstream machen.

    hmm, leider klappt das net so ganz: wenn ich schreibe cout<<hex<<"a" gibt er auch a aus oder wie meinst du das mit dem stringstream?

    net schrieb:

    neomic schrieb:

    wie konvertiere ich einen buchstaben (ansi) in eine zweistellige hexzahl...

    void hex (unsigned char c)
    {
       putchar ("0123456789abcdef"[c>>4]);
       putchar ("0123456789abcdef"[c&15]);
    }
    

    😉

    bunter build log -.-
    habe es dann umgeschrieben als char (anstatt void) und return c, gibt aber nur die dezimalzahl aus und denn buchstaben selber (a = 61a), wo liegt der fehler?



  • Buchstabe A wandeln wir in Int dann Hex und zurück von Hex in Int und dann wieder in char

    char szSz[2]="A";
    char szHex[3];
    int nInt =0;
    
    nInt += szSz[0];//A in Int wandeln A ist nun 65
    
    sprintf(szHex,"%.02x",nInt);//Int in Hex wandeln 65 ist nun 41
    
    int nNewInt = Hex2Int(szHex);//Hex in Int wandeln 41 ist nun wieder 65
    
    char szNewSz[2];
    sprintf(szNewSz,"%c",nNewInt);//Int in Ascii wandeln 65 ist nun wieder A
    

    bevor die frage kommt die funktion stammt nicht von mir

    int Hex2Int(char*I)
    {
        for(int l=0;*I;l*=16,l+=(!!('@'&*I))*9+*I++&'\17');return l;
    }
    

    hier ne Seite für die Legende



  • Dann versuch's mal mit

    int x = 'a';
    cout << hex << x;



  • 61hex = 'a'ascii



  • @LowFly: Diese beiden Funktionen sind nicht wirklich ernst gemeint, oder?



  • welche beiden funktionen??

    fals du zweifel hast probier sie aus und vergleich sie mit der legende



  • Jester schrieb:

    Dann versuch's mal mit

    int x = 'a';
    cout << hex << x;

    danke, das klappt soweit so wie ich es will 🙂

    nur bei höheren zeichen wie zum beispiel "Ö" (213) bekomm ich plöztlich 8 zeichen wo es doch eigentlich nur zwei sein sollten...

    wie löse ich dieses problem?



  • will ja nicht drauf rumreiten aber probier mal meinen weg der ist fehlerfrei und gibt alle zeichen wieder von 0 - 255 in Int Hex & Ascii 😉



  • Dann versuch's mal mit unsigned int. Sieht aus, als würde da was mit dem Vorzeichenbit nicht stimmen.

    LowFly: Die beiden Funktionen sind beide sehr kryptisch und plattes C. Sowas als Problemlösung zu verkaufen ist ein bißchen viel des guten. Insbesondere wenn es ein 2-Zeiler auch tut. Die erste Funktion mag ja für C noch in Ordnung sein, die zweite ist aber wirklich der letzte Hack. Sowas baut doch kein vernünftiger Mensch in seine Programme ein.



  • neomic schrieb:

    Jester schrieb:

    Dann versuch's mal mit

    int x = 'a';
    cout << hex << x;

    danke, das klappt soweit so wie ich es will 🙂

    nur bei höheren zeichen wie zum beispiel "Ö" (213) bekomm ich plöztlich 8 zeichen wo es doch eigentlich nur zwei sein sollten...

    wie löse ich dieses problem?

    Möglichkeit A: Du verwendest Unicode-Zeichen-blabla
    Möglichkeit B: Fehler - irgendwo (dümmste Antwort)
    Möglichkeit C: Das Ö im Konsolenfenster hat ein anderes Ascii... als das Ö von der TAstatur

    (bin mir aber sicher, dass dies entweder falsch odeer schon bekannt ist)

    MfG Rhombicosidodecahedron



  • #include <iostream>
    using namespace std;
    
    int main()
    {
        char ch = 10;
        //hexausgabe  char
        char hexa[] = "0123456789abcdef";
        cout << hexa[(ch&0xf0)>>4] << hexa[ch&0xf] << endl;
    
        return 0;
    }
    


  • @ jester
    hab dich forhin schonmal gefragt auf welche funktionen spielst du an, ich nutz die funktionen so wie ich sie gepostet hab und es geht alles problemlos.



  • neomic schrieb:

    habe es dann umgeschrieben als char (anstatt void) und return c, gibt aber nur die dezimalzahl aus und denn buchstaben selber (a = 61a), wo liegt der fehler?

    du kannst die beiden hexziffern in die ersten beiden zeichen eines char[3]-arrays schreiben, dessen drittes byte immer '0' ist. dann hast du einen C-string. das argument (unsigned char) muss 'unsigned' bleiben, sonst geht der shift (>>4) schief (ausser du maskierst danach mit 0x0f). die zeichenkette mit allen hexziffern brauchste auch nur einmal (z.b. als static const char*). so wie die funktion da steht, soll sie ja nur das prinzip zeigen 🙂

    Jester schrieb:

    @LowFly: Diese beiden Funktionen sind nicht wirklich ernst gemeint, oder?

    die hat heute schon mal einer gepostet. kommen bestimmt von 'nem 'obfuscated C contest' 😉



  • LowFly schrieb:

    @ jester
    hab dich forhin schonmal gefragt auf welche funktionen spielst du an, ich nutz die funktionen so wie ich sie gepostet hab und es geht alles problemlos.

    Ich meine genau die zwei Funktionen die Du gepostet hast. Ich zweifle nicht daran, daß sie funktionieren. Ich sage nur, daß sie häßlich und kryptisch sind. Daher halte sich sie für eine ernstgemeinte Antwort als Hilfe an einen Anfänger für ungeeignet. Daher fragte ich, ob Du das ernst meinst.



  • ich weiß net warum aber das klappt^^

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int ch = 'Ö';
        //hexausgabe  char
        char hexa[] = "0123456789abcdef";
        cout << hexa[(ch&0xf0)>>4] << hexa[ch&0xf] << endl;
        return 0;
    }
    

    ausgabe: d6

    thx problem ist hiermit gelöst 😃



  • lol ja meine ich ernst da sie fehlerfrei funzen
    @net
    ja derjenige war ich und aus welcher foren ecke ich die gekraben hab weis garnet mehr so genau glaub von hier auf der suche nach hex o. byte



  • LowFly schrieb:

    lol ja meine ich ernst da sie fehlerfrei funzen

    Hast Du meine Postings gelesen?
    Ich sage nicht, daß sie nicht funktionieren. Ich sage nur, dass ich es nicht gut finde etwas dermaßen häßliches und kryptisches als Lösungsvorschlag an nen Anfänger zu geben.



  • LowFly deine Dummheit kotzt mich.



  • neomic schrieb:

    ich weiß net warum aber das klappt^^

    Hm, damit sollte man sich nicht zufrieden geben. Nichts gegen die Lösung von net, die ist sehr schick -- aber wenn man sie nicht versteht, sollte man vielleicht erstmal bei den von der STL vorgegebenen Funktionen bleiben, die in jedem guten Anfängerbuch zumindest minimal beschrieben werden:

    inline void put_char(unsigned char c, ostream & out = cout)
    {
        ios::fmtflags old = out.flags(ios::hex);
        out << setfill('0') << setw(2) << static_cast<int>(c);
        out.flags(old);
    }
    
    int main()
    {
        put_char('x');
        cout << endl;
    }
    

    Was hier passiert, sollte mit einer STL-Referenz nachvollziehbar sein.



  • @ jester
    ja hab ich und ich hab auch verstanden das du weist das sie fehlerfrei sind das bezog ich auch nur darauf weshalb ich es ernst meine.

    @ hexx
    was dich ankotzt is nich mein problem, da du noch nichtmal den mut hast sowas als registrierter zu posten kann ich dich nicht ernst nehmen. viel spaß beim sachen waschen. hoffe für dich du hast nichts deftiges gegessen. sonst haste probleme das zeug aus der tastatur zu kriegen 😃


Anmelden zum Antworten