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


von M. M. (karlkappe)


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.
1
#include<stdio.h>
2
#include<stdlib.h>
3
4
int main(int n, char *params[])
5
{
6
if (!(n==3))
7
{   printf("ERROR.  Usage ./bin2float input_file output_file\n");
8
}
9
else
10
{
11
FILE *fi = fopen(params[1],"rb+");
12
FILE *fo = fopen(params[2],"w");
13
if(!fi) printf("not opened");
14
if(!fo) printf("not opened");
15
16
unsigned char b[2084];
17
unsigned char a[2084];
18
fread(b,4,521,fi);
19
int i;
20
int j;
21
for (j=0; j<=2084;j=j+4)
22
{
23
for (i = 0; i < 4; i++) {
24
          a[i+j] = b[3-i+j];
25
           }
26
}
27
int k;
28
float *y = (float *)a;
29
30
for (k=0; k<521; k++){
31
32
fprintf(fo, "%e\n",y[k]);
33
}
34
35
fclose(fi);
36
fclose(fo);
37
38
return 0;
39
40
}
41
}
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?

von Mark B. (markbrandis)


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 :-)

von M. M. (karlkappe)


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:)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.