B.3. Fehlereliminierungsprogramm
Da aufgrund eines Fehlers in dem kommerziellen Bildauswerteprogramm der Firma
Park Scientific Instruments Bilder, die im Modus für Hin- und Rücklauf
aufgenommen wurden, mit diesem nicht bearbeitet werden konnten, werden mittels
folgendem kleinen Korrekturprogramm bestimmte Bytes im Dateikopf der durch
das Bearbeitungsprogramm nicht ladbaren Dateien ausgetauscht, so daß der Fehler
nicht mehr auftritt.
/* park5b_korr.c
Autor: Peter Münster, 1997
Konvertiert Bilder, die im Park-STM-Mode "5B" mit
Source-Schalter auf "log(I)" aufgenommen wurden, in welche,
die das Image-Prozeß-Programm laden kann!
*/
#include <stdio.h>
#include "../mystd.h"
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#define FILE_SIZE 66560
char progname[DAT_NAME_MAX];
// print usage-information and exit
void usage(void){
printf("\nusage: %s file [<files...>]\n\n", progname);
printf("Konvertiert Bilder, die im Park-STM-Mode");
printf(" \"5B\" mit Source-Schalter auf\n");
printf("\"log(I)\" aufgenommen wurden, in welche, ");
printf("die das Image-Prozeß-Programm\n");
printf("laden kann!\n");
exit(1);
}
// Ist das Musterbyte an der gefragten Position?
int muster(char *file, unsigned char byte, long pos){
FILE *fp;
unsigned char byte2;
if(!(fp=fopen(file, "r"))){
FPF("muster: cannot open %s.\n", file);
return 0;
}
if(fseek(fp, pos, SEEK_SET)){
FPF("muster: cannot reposition pointer of %s.\n",
file);
fclose(fp);
return 0;
}
if(fread(&byte2, SOC, 1, fp) != 1){
FPF("muster: cannot read byte %ld.\n", pos);
fclose(fp);
return 0;
}
fclose(fp);
#if DEBUG
printf("debug: Muster = %X, Gefunden: %X\n", byte, byte2);
#endif
return (byte==byte2);
}
// schreibt Datei neu, indem einige Bytes ausgetaucht werden
int konvert(char *file){
FILE *fp;
unsigned char buf[FILE_SIZE];
if(!(fp=fopen(file, "r+"))){
FPF("konvert: cannot open %s.\n", file);
return 0;
}
// die ersten 0x331 Bytes werden übernommen:
if(fread(buf, SOC, 0x331, fp) != 0x331){
FPF("konvert: die ersten 0x331 Bytes konnten aus %s "
"nicht gelesen werden.\n", file);
fclose(fp);
return 0;
}
// es werden 9 Bytes geschrieben, wo woher 13 waren:
strncpy(buf+0x331L, "\x07I CH2,2 ", 9);
// Kleine Überprüfung, damit wir es nicht ein
// zweites Mal machen (geht damit auch ein Byter weiter):
fread(buf+0x33aL, SOC, 1, fp); // keine Fehlerprüfung !
if(buf[0x33aL] == 7){
FPF("konvert: %s wurde schon konvertiert!\n", file);
fclose(fp);
return 0;
}
// setze FILE-pointer um 12 Bytes weiter
// (13, aber 1 bereits durch fread)
fseek(fp, 12L, SEEK_CUR); // keine Fehlerprüfung !
if(fread(buf+0x33aL, SOC, FILE_SIZE-0x33eL, fp) !=
(FILE_SIZE-0x33eL)){
FPF("konvert: die ersten letzten Bytes konnten aus %s "
"nicht gelesen werden.\n", file);
fclose(fp);
return 0;
}
// nur aus Spaß:
strncpy(buf+(FILE_SIZE-4), "hugo", 4);
// zurück:
rewind(fp);
// schreiben des Buffers:
if( fwrite(buf, SOC, FILE_SIZE, fp) != FILE_SIZE){
FPF("konvert: cannot write %ld bytes.\n", FILE_SIZE);
FPF("konvert: %s is probably corrupt now! ---> EXIT\n",
file);
fclose(fp);
exit(1);
}
fclose(fp);
return 1;
}
int main(int argc, char *argv[]){
extern char progname[];
struct stat statbuf;
strncpy(progname, argv[0], DAT_NAME_MAX-1);
if(argc == 1) // nothing to do
usage();
while(--argc){
if(stat(argv[argc], &statbuf)){
FPF("cannot stat %s.\n", argv[argc]);
continue;
}
#if DEBUG
printf("debug: StatBuf.St_Size = %ld.\n", statbuf.st_size);
#endif
if(statbuf.st_size != FILE_SIZE){
FPF("%s hat nicht die richtige Größe.\n",
argv[argc]);
continue;
}
if(muster(argv[argc], 0xdaU, 0x207L)) // Es ist eine
if(!konvert(argv[argc])) // "log(I)-Datei"!
FPF("Achtung: %s wird NICHT konvertiert!\n",
argv[argc]);
}
return 0;
}