Zum Inhalt springen

Einlesen eines Hexstreams


The Incredible Fufialk

Empfohlene Beiträge

Ich bekomme ein Messdatenfile als Hexstream und will diesen wieder in eine lesbare Tabelle umwandeln. Die einzelnen Daten sind dabei folgendermaßen aufgelistet:

1.Wert [blocknummer (integer),Datenlänge (integer), Zeitstempel (long integer), Messwert (integer)]

und dann kommt der nächste Wert.

Der Stream sieht dann ungefähr so aus:

[0200 2000 F511DF41 64000000~0083] [0200 2000 F511DF41 64000000~0083]

Derzeit lese ich noch alles in ein Array ein, was aber quatsch ist, da ich ja verschiedene Typen habe. Vielleicht kann mir ja jemand einen Tipp geben, wie ich vorgehen kann. Hänge mal meinen Quelltext an, damit Ihr wisst, wie weit ich bin.

Code:

#include <iostream.h> // cin, cout

#include <fstream.h> // ifstream, ofstream

#include <stdlib.h> // exit, rand

#include <iomanip.h> // setw

#include <conio.h> // getch

void main()

{

ofstream ofl; // Ausgabestrom

char fileread[64]; // Dateiname der einzulesenden Datei

char filewrite[64]; // Dateiname der Auszugebenden Datei

double c; // Eingabezeichen

char rep; // Kontrollvariable

int i; // Zähler Zeile

int y[1000]; // Array zum einlesen der Daten

begin: // Label

cout << "\n\n Geben Sie den Dateinamen der zu bearbeitenden Datei ein: ";

cin.getline(fileread, 64);

ifstream ifl(fileread, ios::in|ios::binary); //öffnen der Datei zur Eingabe im Binärmodus

if (!ifl) // Fehler beim öffnen der Datei

{

cerr << "\nFehler beim oeffnen der Datei! " << fileread;

cout << "\n\nWollen Sie es noch einmal versuchen? (j/n)";

rep = cin.get();

while (cin.get() !='\n'); // Tastaturpuffer leeren für Schleife bei falscher Eingabe

if (rep == 'n')

{

exit (1);

}

else

{

goto begin;

}

}

ifl.read((char*)y, sizeof(y)); // Dateiinhalt in Array y einlesen

ifl.close();

weiter:

cout << "\n\nUnter welchem Namen soll die datei gespeichert werden?: ";

cin.getline(filewrite, 64);

ifstream cfl(filewrite); // Datei für Ausgabe öffnen

if (!cfl)

goto open;

else

{ // Fehler beim öffnen

cout << "\nFehler! Die Datei " << filewrite << " ist bereits vorhanden!";

cout << "\n\nGeben Sie einen anderen Dateinamen ein!";

goto weiter;

}

open:

ofl.open(filewrite);

for (i = 0; i < 10000; i++) // gelesene Werte in Array schreiben

{

ofl.precision(8); // Zahlen auf 8 Stellen begrenzen

ofl << setfill(' ') << setw(18) << dec << y; // gelesene Werte anzeigen

if(!((i+1)%18)) // 18 Werte pro Zeile

ofl << endl;

}

ofl.close();

cout << "\nKonvertierung abgeschschlossen.\nDie Datei " << fileread << "\nwurde unter dem Namen " << filewrite << " abgespeichert.";

cout << "\n\n\Zum Beenden druecken Sie eine beliebige Taste.";

getch();

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Baue eine Klasse oder Struktur, welche die vier o.g. Eigenschaften enthält. Dann noch eine statische Methode dazu, die einen String, der einen Datensatz enthält, parst und ein Objekt deiner Struktur zurückgibt. Dann kannst du ja noch ein paar Funktionen bauen, welche dir ein Array vom Typ deiner Struktur aus einer Input-Datei ausliest, eine, die dieses Array in eine Tabelle speichert (CSV bietet sich da an) etc.

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, ich hätte da eine kurze Verständnis Frage

1.Wert [blocknummer (integer),Datenlänge (integer), Zeitstempel (long integer), Messwert (integer)]

[0200 2000 F511DF41 64000000~0083]

Das heißt also

[] Trennt die Blöcke

0200 ist die Blocknummer

2000 ist die Länge

F511DF41 ist der Zeitstempel

64000000~0083 ist der Messewert

aber wozu dient dieser wert "~0083"?

Gehört das zum messwert?

Den ~ ist kein Hexzeichen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, ich hätte da eine kurze Verständnis Frage

Das heißt also

[] Trennt die Blöcke

0200 ist die Blocknummer

2000 ist die Länge

F511DF41 ist der Zeitstempel

64000000~0083 ist der Messewert

aber wozu dient dieser wert "~0083"?

Gehört das zum messwert?

Den ~ ist kein Hexzeichen

Habe die Klammern nur gesetzt, um die Blöcke zur besseren verständnis zu trennen. Der Messwert selbst kann bis zu 32 Worte lang sein habe das ~ nur als Platzhalter eingefügt. Im File stehen dort natürlich echte Werte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also die Struktur ist nicht das Problem, würde für meinen Fall so aussehen:

struct

{

int block1;

int length1;

long int zeit1;

int werte1[32];

int block2;

int length2;

long int zeit2;

int werte2[24];

} Messwert;

Auf Grund mangelnder Kenntnisse weiß ich aber nicht, wie ich die Daten korrekt aufgeteilt bekomme. Die Literatur die ich benutze beschreibt nur, wie die Structuren sofort deklariere bzw. wie ich über Tastatureingaben weitere werte zuweisen kann. Habt Ihr da vielleicht noch einen Tipp, wo ich das mal nachlesen könnte? Vielen Dank.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...