mikrocontroller.net

Forum: PC-Programmierung C#-Konsole Binär-Datei in Float umwandeln


Autor: M. M. (karlkappe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,
ich habe mir ein kleines Programm geschrieben um Messdaten aus einer 
Binärdatei in Float umzurechnen. Ich gebe zu ich bin kein erfahrener 
Programmierer bin aber doch stloz es soweit zum laufen bekommen zu 
haben. Verbesserungsvorschläge nehme ich trotzdem dankbar an.
#include<stdio.h>
#include<stdlib.h>

int main(int n, char *params[])
{
if (!(n==3))
{   printf("ERROR.  Usage ./bin2float input_file output_file\n");
}
else
{
FILE *fi = fopen(params[1],"rb+");
FILE *fo = fopen(params[2],"w");
if(!fi) printf("not opened");
if(!fo) printf("not opened");

unsigned char b[2084];
unsigned char a[2084];
fread(b,4,521,fi);
int i;
int j;
for (j=0; j<=2084;j=j+4)
{
for (i = 0; i < 4; i++) {
          a[i+j] = b[3-i+j];
           }
}
int k;
float *y = (float *)a;

for (k=0; k<521; k++){

fprintf(fo, "%e\n",y[k]);
}

fclose(fi);
fclose(fo);

return 0;

}
}
Das ganze funktioniert solange ich vorher den Header der Datei von Hand 
wegmache. Der header ist nämlich in Klartext also ist das recht einfach. 
Nun habe ich eine Menge Dateien und wie ihr sehen könnt sind eine 
Parameter wie die Länge der Datei einfach von Hand ausgerechnet ins 
Programm geschrieben worden. Diese Informationen kann ich ganz einfach 
aus dem Header lesen. Jetzt würde ich das ganze natürlich gerne auch 
automatisieren, Ok nun endlich meine Fragen. Wie kann ich den Header 
getrennt einlesen? Wie ist es möglich den Klartextteil für die Binär 
Umrechnung zu ignorieren, zumal der immer unterschiedlich lang ist?

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit fseek() kann man an jede beliebige Stelle der Datei springen und von 
da an die Werte verarbeiten. Natürlich muss man dafür die Position 
irgendwie berechnen/erkennen, an die man springen soll. So wie Du sagst 
ist diese ja variabel. Wie sich der Header und Deine Binärdaten 
voneinander unterscheiden, das wissen wir leider nicht.

Ach ja, und C# ist der hier gezeigte Beispielcode ganz sicher nicht :-)

Autor: M. M. (karlkappe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark Brandis schrieb:
> Mit fseek() kann man an jede beliebige Stelle der Datei springen und von
> da an die Werte verarbeiten. Natürlich muss man dafür die Position
> irgendwie berechnen/erkennen, an die man springen soll. So wie Du sagst
> ist diese ja variabel. Wie sich der Header und Deine Binärdaten
> voneinander unterscheiden, das wissen wir leider nicht.

Das ist ein guter Einwand:
Meas dim="200 x 200"
Meas set=1.200000E+1;2.000000E+1;1.300000E+1;2.100000E+1;
Meas Unit="V"
Const="Start;End"
Var="X (m);Y (m);Z (m)"
# Param. (4 byte)=5 <- das bräuchte ich
Experiment size (bytes)=2048 <- die Zahl auch
Counts=300 <-und das
Ch="Ch 07(V);Ch 03(V)" <-das ändert sich dauernd
Date="30.08.2010 00:52:11"
:HEADER_END:
0d 0a c6 60 e3 ae c2 bf ae bff1 ae be e8 94 ae ba 8e d9......(das ist in 
HEX-Darstellung es ist 4 byte big endian, und die ersten zwei Byte sind 
der Zeilenumbruch nach dem :HEADER_END:)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.