[C++] StringToHex, IntToHex, HexToString und HexToInt

  • Hey
    Ich suche verkrampft StringToHex, IntToHex, HexToString und HexToInt in C++. Ich habe schon über 10 Ansätze, aber leider vergebens.. Mein Problem ist es, dass ich bei StringToHex, nicht nur ein Zeichen, sonder einen ganzen String angeben möchte. Außderdem möchte ich, dass ich dann noch bei HexToString und HexToInt der dies automatisch erkennt.
    Hoffe ihr versteht was ich meine - oh man, why gibt es nicht solche Funktionen in Includes?
    Auch schon Ansätze wären sehr hilfreich
    mfg

    Nur keine Hektik - das Leben ist stressig genug

  • oher soll er denn erkennen, ob Int oder String rauskommen soll, irgendeinen anhaltspunkt msus es ja geben. Abgesehen davon, kann man keine Überladungen machen, wo die Parameter gleich sind, aber die Rückgabe sich unterscheidet, woher soll der Compiler auch wissen was wo gemeint ist. Ich würde dann Pointer übergeben, wo das reingeschreiben werden soll.

    Folgendes hab ich schonmal geschrieben, ist aber nicht so gut um es verwenden zu wollen, benutz es lieber um dein eigenes zu schreiben.

    Spoiler anzeigen
  • Int2Hex ist das einfachste^^

    Du musst nur 4er-Gruppen aus den Bits machen. Beispiel, der Integer 91 ist binär 0101 1011
    die erste 4er-Gruppe Bits 0101 ergibt dezimal 5, also 5h
    die zweite vierergruppe Bits 1011 ergibt dezimal 11, also Bh
    91 dezimal ist also 5Bh

  • Int2Hex ist das einfachste^^


    Das gibt es doch auch schon als itoa mit basis 16 oder sprintf ;) Die Performance sollte aber besser sein, wenn man eine spezialisierte Funktion erstellt.

  • Leider kann ich nicht BYTE benutzen, ich benutze C::B mit MinGW.
    Hat jmd eine andere Lösung?
    Ihr würdet mir sehr weiterhelfen :thumbup:

    Edit:
    Ich habe Char2Hex so gelöst, aber wie kann ich ihn wieder zurück konvertieren?

    Code
    char buffer [50];
    char *test="sdfsdf";
    sprintf (buffer, "%X", test);
    printf ("%s\n",buffer);

    Nur keine Hektik - das Leben ist stressig genug

    Einmal editiert, zuletzt von AntiSpeed (6. Juni 2011 um 17:35)

  • Uhm, ich hab da einen Fehler (was denn anpassen?). Leider zeigt mir C::B nix and und das Programm stürtzt ab.

    Nur keine Hektik - das Leben ist stressig genug

  • 1. Du returnst pointer auf lokale Variablen (löst Fehler aus)
    2. Du schreibt in nicht alloziierten Speicher (löst den Absturz aus)


    Arbeite mehr mit Buffern.

    So geht bei mir alles:

    Spoiler anzeigen
  • Vielen Dank :thumbup:

    Nunja das ist genau das was ich wollte, aber wie kann ich nun dies als "wirkliches Hex" (also int 0x..) abspeichern? Also ich habe soetwas, dabei wird aber auch wirklich der Char und nicht der Hex-Wert übertragen. Also in au3 muss man eine File ja binär öffnen für eine Binary, der ja eigentlich Hex ist.

    Code
    ofstream eingabe(path,ios_base::out | ios_base::binary);
    if (eingabe.good()) {
     char hex[50];
     StringToHex(ItemCon, hex, 50);
     eingabe << hex;
     eingabe.close();
    }

    Nur keine Hektik - das Leben ist stressig genug

  • Gehen wir hier von eben aus :D:


    Aber dies funktioniert genau so wenig und "AF41" wird als Text und nicht als Hex abgespeichert, obwohl ich 'b' als Parameter angegeben habe.

    Nur keine Hektik - das Leben ist stressig genug

  • Der unterschied beim zusätzlichen b ist nur gering.
    Ohne das b werden alle Zeilenumbruche CR (\n) zu CRLF (\n\r).

    Um wirklich binärdaten zu schreiben, würde ich auch kein fputs nehmen, sondern fwrite.

    Code
    char * binary = new char[1024];
    //......
    fwrite(file, binary, 1, 1024);
    Code
    char * binary = new int[512];
    //......
    fwrite(file, binary, 4, 512);
  • Aber dies funktioniert genau so wenig und "AF41" wird als Text und nicht als Hex abgespeichert, obwohl ich 'b' als Parameter angegeben habe.


    Selbstverständlich wird es als "Text" gespeichert. Auch eine Textdatei ist eine binäre Datei, so wie alle Dateien.
    Zahlensysteme existieren nur im Kopf. Der Computer versteht nur Nullen und Einsen.
    Du möchtest jetzt vier Bytes Text als zwei Bytes Hex speichern.
    Deine vier Bytes ASCII "AF41" binär: 0100 0001 (=A) 0100 0110 (=F) 0011 0100 (=4) 0011 0001 (=1).


    Gruß
    Greenhorn


  • Marthog:
    Vielen Dank :party:, aber ich bekomm ohne praktisches Bsp das iwie nicht auf die Reihe (ja auch mit der Referenz nicht) !?
    Ich versteh nicht ganz wie das funkioniert soll:

    Zitat
    Code
    char * binary = new char[1024];
    fwrite(file, binary, 1, 1024);

    Nur keine Hektik - das Leben ist stressig genug

  • Code
    char * binary = new char[1024];

    erzeugt nur einen buffer und ist damit erstmal nicht so wichtig.

    AF41 kann man so binär abspeichern:

    Code
    char *buffer = new char[3];
    HexToString("AF41", buffer, 3);
    fwrite(file, buffer, 1, 2);

    Die beiden Zahlen bei fwrite geben die Elementgröße an (1 wegen char) und die Anzahl der Elemente (2). Also zweimal ein byte.

    EDIT: Der Buffer muss um 1 größer sein, damit auch die übliche 0 am Ende eines Strings noch daranpasst. Sie wird aber nicht mit in die Dtaei geschrieben.

  • Ich habe aber mit deinem Code ein Compilfehler:

    Spoiler anzeigen


    Dieser lautet:

    Code
    \Documents\CodeBlocks Projects\substr\main.cpp||In function `int main()':|
    \Documents\CodeBlocks Projects\substr\main.cpp|35|error: invalid conversion from `char*' to `size_t'|
    \Documents\CodeBlocks Projects\substr\main.cpp|35|error:   initializing argument 2 of `size_t fwrite(const void*, size_t, size_t, FILE*)'|
    \Documents\CodeBlocks Projects\substr\main.cpp|35|error: invalid conversion from `int' to `FILE*'|
    \Documents\CodeBlocks Projects\substr\main.cpp|35|error:   initializing argument 4 of `size_t fwrite(const void*, size_t, size_t, FILE*)'|
    ||=== Build finished: 4 errors, 0 warnings ===|

    Nur keine Hektik - das Leben ist stressig genug