Autor |
Beitrag |
Endanwender
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 raziel: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 17.03.2006 um 16:20
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: 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
|
Verfasst: 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:
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>
void main(int argc,char *argv[]);
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;
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); }
if (fread(&tf,sizeof(traceFileHdr),1,inp_f) != 1) { printf("\nError reading file header!\n\n"); exit (2); }
if (fread(traceBuffer,sizeof(int),1024*tf.chnRec,inp_f)!=1024*tf.chnRec) { printf("\nError reading file data!\n\n"); exit (2); }
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
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 17.03.06 16:34
Hallo,
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} type {$IfDef TwoByteInt} tmyInt = smallint; tmyUint = word; {$Else} tmyInt = integer; tmyUint = Cardinal; {$EndIf}
tFtype = array[0..11] of char;
TTraceFileHdr = packed record fType :tFtype; intWidth, intExt, chnRec, hGain, leftBin, fpMode, bottomRef, vGain : TmyInt; fBottom , fScrn, datMin, datRng : single; recCount : TmyUint end;
TTraceBuffer = array[0..16999] of 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;
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!'); end;
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
|
Verfasst: 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
|
|
|