Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Einlesen eines Hexstreams

Empfohlene Antworten

Veröffentlicht

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();

}

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ß

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

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.

Habe mich oben etwas ungünstig ausgedrückt. Die Reihenfolge der Daten ist folgendermaßen:

Blocknummer (int), Anzahl der Messwerte (int), Zeitstempel (long int), Messwerte (int) mit maximal 32 Werten je Block.

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.