Autor Beitrag
Endanwender
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 16.03.06 22:28 
Hallo,

ich sitze hier und überlege mir gerade wie man eine Dateikonvertierung vornehmen kann? Ok, kurz der eigentliche Sachverhalt. Ich habe ein Messinstrument, dass die Messdaten leider nur in Dateien mit binärem Code speichert. Zur Auswertung ist damit eine Konvertierung in ASCII notwendig. Nun habe ich jedoch keinen Schimmer, wie man das realisiert?

Würde mich über Hilfestellungen seitens der Community sehr freuen.

Schöne Grüße
der Endanwender


Moderiert von user profile iconraziel: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 17.03.2006 um 16:20
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Fr 17.03.06 09:39 
Es ist mir nicht ganz klar was Du meinst !

Eine Binärdatei ist auch eine ASCII Datei, das ist eine reine Interpretationsfrage.

Will sagen, wenn ich eine Binärdatei in eine Textdatei durch ändern der Dateiendung "umwandele", dann wird diese als ASCII Text interpretiert ohne etwas an den Daten zu ändern.(reine Darstellungsfrage)




Also was genau möchtest Du umwandeln ??

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Endanwender
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 17.03.06 14:37 
Hmm, wie drücke ich mich den am besten aus...??

Machen wir es ganz einfach. Ich nehme die Datei, schaue sie mir mit dem Editor an und sehe nichts außer wilde Zeichen. Was aber drin steckt in diesen Dateien sind Messwerte in Form von 2 Spalten. Was ich nun machen möchte ist eine Umwandlung dieser Dateien. Da ich nicht so richtig nen Plan habe, was das bedeutet und wie man das macht wollte ich mich hier mal schlau machen. Es existiert bereits ein C Quellcode, denn ich aber derzeit nicht verstehe. Außer ich nehme mir ein C Buch und schlage die einzelnen Anweisungen nach.

MFG
der Endanwender

PS: Hier mal der C Code dazu:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* function prototypes */

void main(int argc,char *argv[]);

/* file structure definition */

typedef struct
{
    char fType[12];
    int intWidth;
    int intExt;
    int chnRec;
    int hGain;
    int leftBin;
    int fpMode;
    int bottomRef;
    int vGain;
    float fBottom;
    float fScrn;
    float datMin;
    float datRng;
    unsigned long recCount;
} traceFileHdr;

/* trace buffer */

int traceBuffer[17000];


void main(int argc,char *argv[])
{
    FILE *inp_f,*out_f;
    traceFileHdr tf;
    float a;
    int i;

    if (argc!=3)  {
        printf("\nUsage: bintoasc <input file> <output file>\n\n");
        exit (2);
    }

    inp_f = fopen(argv[1],"rb");
    out_f = fopen(argv[2],"w");
    if (inp_f==NULL)  {
        printf("\nCannot open input file!\n\n");
        exit (2);
    }
    if (out_f==NULL)  {
        printf("\nCannot open output file!\n\n");
        exit (2);
    }

    /* get file header */

    if (fread(&tf,sizeof(traceFileHdr),1,inp_f) != 1)   {
        printf("\nError reading file header!\n\n");
        exit (2);
    }

    /* get trace buffer */

    if (fread(traceBuffer,sizeof(int),1024*tf.chnRec,inp_f)!=1024*tf.chnRec) {
        printf("\nError reading file data!\n\n");
        exit (2);
    }

    /* check id string */

    if (strncmp(tf.fType,"SR430_TRACE\x1a",11))  {
        printf("\nNot a trace file!\n\n");
        exit (2);
    }

    for (i=0;i<1024*tf.chnRec;i++)  {
        if (!tf.fpMode)
            a = (float)traceBuffer[i];
        else
            a = (float) (unsigned) traceBuffer[i]*tf.datRng/65535.0 + tf.datMin;

        fprintf(out_f,"%d\t\t%e\n",i,a);
    }
    fcloseall();
    printf("\nSuccessfully converted file %s\n\n",argv[1]);
}
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 17.03.06 16:34 
Hallo,

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
program DatUmw;

{$APPTYPE CONSOLE}

uses
  SysUtils;
{$Define TwoByteInt} // Ohne $ werden $ 4 Byte Varianten genutzt 
type
{$IfDef TwoByteInt}
  tmyInt = smallint;
  tmyUint = word;
{$Else}
  tmyInt = integer;
  tmyUint = Cardinal;
{$EndIf}

tFtype = array[0..11of char;

TTraceFileHdr = packed record
    fType :tFtype;
    intWidth,
    intExt,
    chnRec,
    hGain,
    leftBin,
    fpMode,
    bottomRef,
    vGain : TmyInt;//oder integer
    fBottom ,
    fScrn,
    datMin,
    datRng : single;
    recCount : TmyUint// oder Cardinal
    end;

TTraceBuffer = array[0..16999of tMyInt;
const
 FileType : tFtype = 'SR430_TRACE'+#$1a;

var
  inDatei : File;
  outDatei: textFile;
  Header : TTraceFileHdr;
  TraceBuffer : TTraceBuffer;
  a : single;
  i,
  DatenSaetze,
  gelesen : integer;
  bTest : boolean;
begin
  If ParamCount <> 2 then
    exit;

  If Not(fileExists(ParamStr(1))) then
    begin
    writeln('Eingabedatei existiert nicht');
    Halt(1)
    end;

  assign(inDatei,ParamStr(1));

  reset(inDatei,1);


  IF fileSize(inDatei) < SizeOf(Header) then
    begin
    closeFile(inDatei);
    writeln('Die Datei ist zu klein');
    Halt(2);
    end;

  BlockRead(InDatei,Header,SizeOf(Header),gelesen);
  iF Gelesen <> SizeOf(Header) then
    begin
    closeFile(inDatei);
    writeln('LeseFehler');
    Halt(3);
    end;

  // check id string */
  bTest := true;
  I := 0;
  repeat
    bTest:= btest AND(Header.fType[i]=FileType[i]);
    inc(i);
  until Not(bTest) Or (I>High(TFtype));

  IF Not(bTest) then
    begin
    writeln('Not a trace file!');
//    Halt(4);
    end;

  {Jetzt einlesen und umwandeln}
  assign(outDatei,ParamStr(2));
  {$I-}
  rewrite(outDatei);
  {$I+}

  If IoResult <> 0 then
    begin
    writeln('Kann '+ParamStr(2)+' nicht erstellen');
    Halt(5);
    end;
  DatenSaetze := Header.chnRec*1024;
  IF SizeOf(TraceBuffer)<SizeOf(tmyInt)*Datensaetze then
    begin
    writeln('Zuviele Datensaetze');
    Halt(6);
    end;
  BlockRead(inDatei,TraceBuffer,SizeOf(tmyInt)*DatenSaetze,gelesen);
  IF gelesen  <>SizeOf(tmyInt)*DatenSaetze then
    begin
    writeln('Konnte nicht alles einlesen');
    Halt(7);
    end;

  if Header.fpMode = 0 then
    begin
    for i:= 0 to DatenSaetze do
      begin
      a := traceBuffer[i];
      writeln(outDatei,Format('%d'#9#9'%e',[i,a]));
      end;
    end
  else
    begin
    for i:= 0 to DatenSaetze do
      begin
      a := cardinal(traceBuffer[i])*Header.datRng/65535.0 + Header.datMin;
      writeln(outDatei,Format('%d'#9#9'%e',[i,a]));
      end;
    end;
    
  closeFile(inDatei);
  closeFile(outDatei);
  readln;
end.


Aufruf zum Beispiel mit
DatUmw.exe C:\meine.dat C:\Test.txt
Ungetestet ohne Testdatei.

Gruss Horst
Endanwender
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 17.03.06 16:43 
Oh, danke schön Horst für Deine Mühe! Werde mir das übers Wochenende mal reinziehen. Mal schauen, ob ich es verstehe.

Schöne Grüße und schönes Wochenende an Alle!
der Endanwender