C#-Konsole Binär-Datei in Float umwandeln

OP #2037821
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?
#2037856
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 :-)
OP #2037869
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren