Bestimmten Block aus inter Hex File lesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Ostrich
Beiträge: 23
Registriert: Fr Okt 03, 2014 2:57 pm

Bestimmten Block aus inter Hex File lesen

Beitrag von Ostrich » Fr Okt 03, 2014 3:23 pm

Hallo
ich habe eine Datei im Intel.Hex Format.
hierraus möchte ich einen besimmten 8 Byte langen Block lesen.

z.B. den Block von Adresse $210 - $218
diese 8 Byte sollen jeweils in eine Variable als Hex gespeichert werden. oder alt in ein Array. Denn ich möchte Sie weiter verarbeiten

Das ganze soll in C passieren

P.S.: Als erweiterung möchte ich auch ein bestimmten teil aus einer Datei lesen, die nicht im intel.hex Format ist, sondern schon als Binärdatei umgewandelt ist

Danke

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Bestimmten Block aus inter Hex File lesen

Beitrag von cloidnerux » Fr Okt 03, 2014 3:59 pm

Hi und Willkommen im Forum :D

Du stellst leider keine Frage, daher kann ich dir auch keine Antwort geben.

Sofern du dich noch nicht mit dem programmieren in C auskennst, sollte das der beste Startpunkt sein: http://www.proggen.org/doku.php?id=c:start

Gruß

cloidnerux
Redundanz macht wiederholen unnötig.
quod erat expectandum

Ostrich
Beiträge: 23
Registriert: Fr Okt 03, 2014 2:57 pm

Re: Bestimmten Block aus inter Hex File lesen

Beitrag von Ostrich » Fr Okt 03, 2014 7:20 pm

Naja ich hab doch geschrieben, was ich vor habe.
jetzt die Frage

--> Kann mir jemandsagen wie ich das mache?

- Wer die Frage noch genauer brauche. wie kann ich in einem HEX-File die genaue Adresse definieren und die Länge des Strings den ich dann auslese um ihn weiter zu verarbeiten.
- 2.Teil wie mache ich das gleiche in einer Binärdatei
Danke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Bestimmten Block aus inter Hex File lesen

Beitrag von Xin » Sa Okt 04, 2014 9:05 am

Oestrich hat geschrieben:--> Kann mir jemandsagen wie ich das mache?
Wichtiger Punkt ist "ich mache", ansonsten hätten wir den Thread direkt ins Hausaufgaben-Board verschoben.

Ich gehe mal davon aus, dass rudimentäre Grundkenntnisse in C da sind, ansonsten folge bitte cloidnerux Link.

Bitte schau Dir die Funktionen fopen(), fread() und zur Positionierung fseek() an.

Wenn Du ein Binärfile öffnest, musst Du (zumindest unter Windows) den Modus "r+b" nehmen, Du positionierst Dich mit fseek in der Datei und lädst dann mit fread die Daten.
Oestrich hat geschrieben:- Wer die Frage noch genauer brauche. wie kann ich in einem HEX-File die genaue Adresse definieren und die Länge des Strings den ich dann auslese um ihn weiter zu verarbeiten.
- 2.Teil wie mache ich das gleiche in einer Binärdatei
Der Dateityp spielt dabei keine Rolle.
Die Position wird immer in Byte ab Beginn der Datei gesetzt (SEEK_SET).
Am Ende eines Strings folgt in der Regel die 0. Du kannst also einen Block einlesen und gucken, ob Du eine 0 findet oder ob das alles zum String gehört.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Ostrich
Beiträge: 23
Registriert: Fr Okt 03, 2014 2:57 pm

Re: Bestimmten Block aus inter Hex File lesen

Beitrag von Ostrich » Sa Okt 04, 2014 9:51 am

Hallo
Ja Kenntnisse sind vorhanden. Mit fseek hab ich auch schon gearbeitet. Allerdings lässt sich in einem hex file ja nicht Byte für Byte suchender springen. Ich müsste es erst in ein bin file formatieren.

Ich hatte gehofft es gibt eine Funktion die direkt einen gewünschten Block auslesen kann

Also muss ich das wohl doch eher händisch machen oder ?

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Bestimmten Block aus inter Hex File lesen

Beitrag von mfro » Sa Okt 04, 2014 11:42 am

It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Ostrich
Beiträge: 23
Registriert: Fr Okt 03, 2014 2:57 pm

Re: Bestimmten Block aus inter Hex File lesen

Beitrag von Ostrich » Do Okt 09, 2014 11:26 pm

Hallo
Also ich habe es mir jetzt etwas einfacher gemacht.
Anstatt das HEx in Bin zu wandeln, habe ich ein Tool gefunden was das macht. dies nutze ich jetzt.

Aber ich habe ein paar Probleme aus meinem Bin File die zeichen richtig zu lesen.
hier mein Code

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



int main()
{

char a[1];
char b[2];

FILE * Filespeicher;

Filespeicher = fopen ("test.bin", "rb");

if (Filespeicher == NULL)
{printf("ERROR. Can't find/open the test.bin File.\n");
return EXIT_FAILURE;}

fseek (Filespeicher,4, SEEK_SET);


  fread( &a, 1, 1, Filespeicher );
  fread( &b, 1, 1, Filespeicher );
  printf( "Hexwerte in der Datei: '%x' und '%x'\n", a ,b );


fclose (Filespeicher);

return 0;
}
Hier der Anfang meines Hex:
80 14 05 58 00 91 FC 00 FF 59 92 AC 00 91 FC 00 AF 09

Ih bekomme imemr als Ausgabe '28ff1b' und '28ff19'

Wenn ich meine Varioablen a, b nciht als Array definiere geht es.
alelrdings hate ich dann das Problem, das ich, wenn er z.B. Byte2 (= 05) aus ließt ließt er nur die 5. ist ja auch ok, aber wenn ich die werte wieder irgendwo in eine datei schreiben will, schreibt er halt nur 5 und nicht 05

Und dazu kommt ja, das ich eigentlich das Array byte für byte shreiben wollte.
z.B.
a[0] = 80
a[1] = 14
a[2] = 05
a[3] = 58


Hate jemand ne kleine hilfe parrat

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Bestimmten Block aus inter Hex File lesen

Beitrag von mfro » Fr Okt 10, 2014 4:14 am

Ostrich hat geschrieben:

Code: Alles auswählen

    ...
    char a[1];
    char b[2];
    
    ...
    fread( &a, 1, 1, Filespeicher );
    fread( &b, 1, 1, Filespeicher );

    ...  
    printf( "Hexwerte in der Datei: '%x' und '%x'\n", a ,b );
...
Wenn ich meine Varioablen a, b nciht als Array definiere geht es.
....
Hate jemand ne kleine hilfe parrat

Ja. Mach' dir klar, wie Arrays in C repräsentiert werden - eine Array-Variable ist nichts anderes als ein Zeiger auf ihr erstes Element.

Dann verstehst Du auch, warum das nicht funktionieren kann: wenn Du von diesem Zeiger die Adresse bestimmst und fread() dorthin lesen läßt, hast Du den Zeiger selbst überschrieben statt den Speicherbereich, auf den er zeigt. Ab da kommt nur noch Müll raus. Bring' das in Ordnung, dann müsste das Einlesen schon mal funktionieren.

Wenn Du die selbe Überlegung beim Ausgeben noch mal anwendest, wirst Du erkennen, daß Du dort denselben Fehler gemacht hast.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten