Hex String -> Int



  • Hallo zusammen

    Ich möchte ein HexFile auslesen, und die verschiedenen Werte wie Länge, Adresse, Daten, ... in Integer Variablen ablegen. Ich habe seither die Daten als einen String eingelesen und mit StrToInt konvertiert. Jedoch dies geht nicht, denn sobald Buchstaben kommen ist es vorbei. Gibt es eine Funktion zum Wandeln, oder eine Möglichkeit die Daten als int einzulesen, oder irgendwie mit dem ACSII Wert zu rechnen?

    VIelen Dank

    MfG Keks



  • Sag doch erstmal, wie Du die Datei einliest. Dann schau Dir doch mal die AnsiString Klasse in der Borlandhilfe an.

    Wenn Du die Datei komplett in einen String einliest, kannst Du doch mit einem Zeiger auf ein Byte wunderbar durch den String laufen und die Zahlenwerte umwandeln?



  • Also mit HexToInt würde es gehen:

    HexToInt(String);

    mit IntToHex(int, int); kannst du von int zum Hex (String) umwandeln. die 2. Int-Zahl gibt die mindestlänge der Hex-Zahl an, 2 ist z.B. für Farben geeignet.



  • Hallo zusammen

    Sorry das ich mich jetzt erst wieder melde.
    Also einlesen tue ich momentan mit fgets. Das mit dem Pointer ist nicht schlecht, jedoch wenn ich ein Byte ausgewählt habe, und dann mit StrToInt Wandle, sieht er es nicht als Hexzahl sondern als Dezimalzahl. Hab mich momentan damit beholfen, dass ich ein "0x" davorstelle, dann tut es.
    Bin allerdings für schönere Lösungen offen.

    Zum Hintergrund, ich möchte aus einem HexFile Daten in ein serielles Flash über LPT1 schreiben.

    Spieleprogrammierer:
    Ich konnte die Funktion HexToInt(String) nicht finden (auch in der Hilfe nicht), brauch ich einen bestimmten Header, oder was ähnliches?

    MfG Keks



  • Ja, ne, gibts auch nicht, IntToHex(int,int) gibts, dann musst du mit StrToInt arbeiten.



  • sscanf ist auch ganz niedlich... oder die guten alten stringstream-IO-Funktionen können meines Wissens auch Hex2int bzw. int2Hex wandeln.

    -junix



  • hm ich hab früher mal testweise einen einfachen hexeditor gebaut, vieleicht hilft dir der, am intressantesten dürfte wohl view_hex sein:

    Auf der Form brauchst du
    -savedialog (speichern)
    -loaddialog (laden)
    -2 buttons (Button1/Button2)
    -1 Memo (Memo1)

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    AnsiString filename = "testdatei.bin";
    
    #include <fstream>
    #include <vector>
    #include <string>
    using namespace std;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void view_hex(TMemo* memofeld, unsigned char* werte, int laenge)
    { // neue Datei soll im Hexeditorformat angezeigt werden
    
      memofeld -> Lines -> Clear();
      AnsiString hexwerte ="";
      for(int i = 0; i < laenge;i++)
      {
        if(!(i%16)) 
        {
          if(i>10)
          {
            hexwerte += " ; ";
            for(char j=16;j>0;j--) // Zeichen nach Semikolon nocheinmal ausgeben
            {
              char zwischen = (char)werte[i-j];
              if(werte[i-j] =='\r' || werte[i-j] =='\t' || werte[i-j] =='\n') // tabs und zeilenumbrüche entfernen sonst chaos
              zwischen = 10;
    
              hexwerte+= zwischen;
            }
          }
          memofeld -> Lines -> Add(hexwerte);
          hexwerte=IntToHex(i,8)+"h:"; // Adresse ausgeben (sowas wie 0000ff00h:)
        }
        hexwerte = hexwerte + IntToHex(werte[i],2); // hexwert hinzufügen
        if(IntToHex(werte[i],2).Length() > 2)ShowMessage((int)werte[i]); // tritt nur bei Fehlern auf die eigentlihc nicht mehr auftreten sollten
        hexwerte += " "; // eine Leerzeile zwischen jedem Zeichen
      }
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      unsigned char* datei =0;
    
      if(!laden ->Execute())
      {
        return; 
      }
    
      filename = laden -> FileName;
    
      long l,m;
      ifstream file(filename.c_str(), ios::in|ios::binary);
      l = file.tellg();
      file.seekg (0, ios::end);
      m = file.tellg();
      long filesize = (m-l);
      file.seekg (0, ios::beg);
      if(datei)
      {
        delete datei; // wenn laden schon einmal ausgeführt wurde und irgendwie nicht gelöscht wurde das letzte Ergebnis löschen
      }
    
      datei = new unsigned char[filesize];
      file.read(datei, filesize); // nachdem grösse bestimmt und speicher reserviert wurde das Ding jetzt einlesen
      file.close();
    
      view_hex(Memo1, datei,filesize); // und dann anzeigen
      delete datei;
      //AnsiString line;
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
    {
    
      // es können nur Zeichen von 0-f im HExeditorfenster eingegeben werden  
      if(Key <= 'f' && Key >= 'a')
      {
        Key = Key - ('a'-'A'); // aus kleinbuchstaben grossbuchstaben machen
      }
    
      if(Key >= '0' && Key <= '9' || Key <= 'F' && Key >= 'A')
      {
      }
      else Key = 0;
    }
    //---------------------------------------------------------------------------
    

    *edit*
    so besser junixilein? 😃

    [ Dieser Beitrag wurde am 24.06.2003 um 10:48 Uhr von dreaddy editiert. ]



  • Hmm... nett... wärs zuviel, etwas Kommentar und eine etwas schönere Strukturierung zu verlangen? (o;

    Ausserdem wage ich zu behaupten, meine sscanf()-Hex2Bin-Methode ist vermutlich noch etwas schneller als deine Variante (o;

    -junix



  • joah, so geht dat auch...

    Ha, genau an sowas dachte ich auch, ich hätt zwar an manchen stellen etwas anderes genommen, oder anders formuliert, aber so das Grundprinzip ist gleich, muss es ja auch *g*



  • Naja Kommentare kann ich reinmachen, mit der Strukturierung binich eigentlich soweit zufrieden 😛
    die ladefunktion sieht zwar etwas seltsam aus aber das ist nur auf den ersten Blick, danach stürzt einem das geballte Wissen ins Gesicht 😃

    Aber deine Variante wird schneller sein weil meine dadrauf ausgelegt ist am Ende einen Hexeditor ähnlichen Output zu erzeugen, also sowas wie

    00039040h:6D 65 72 2C 63 6F 75 6E 74 29 0D 0A 29 20 54 59  ; mer,count)) TY
    00039050h:50 45 3D 4D 79 49 53 41 4D 3B 0D 0A 0D 0A 2D 2D  ; PE=MyISAM;--
    00039060h:0D 0A 2D 2D 20 44 75 6D 70 69 6E 67 20 64 61 74  ; -- Dumping dat
    00039070h:61 20 66 6F 72 20 74 61 62 6C 65 20 27 74 72 61  ; a for table 'tra
    00039080h:65 63 68 74 69 67 6B 65 69 74 73 6B 75 72 76 65  ; echtigkeitskurve
    

    [ Dieser Beitrag wurde am 24.06.2003 um 10:43 Uhr von dreaddy editiert. ]



  • Naja, ich mach dir heut Abend mal ne Mail und zeig dir mal wie ich mir sowas vorstelle (o;

    Was die Geschwindigkeit betrifft: Ich hatte ebenfalls solchen Output zu generieren und glaub mir ich hab viel ausprobiert um die Geschwindigkeit zu pushen. Das Zusammensetzen des String am Schluss (nachdem du auf einen Schlag schonmal den Speicher voraloziert hast den du brauchst (und das weisst du ja, nachdem du die Daten generiert hast)) und das Konvertieren dazwischen mit sscanf ist zimlich sicher erheblich schneller (o;

    Ausserdem lässst sich dann der Output mittels sprintf() Wunderbar durch ne Format-Maske pressen (sowas wie %X %X %X %X ; %s\n für 4-Byte-Zeilen (o: )

    -junix


Anmelden zum Antworten