FITS (Flexible Image Transport System) 是国际天文学会(IAU)1982 年确定的世界各天文台之间用于数据传输、交换的统一标准格式。它描述了数据的定义和数据编码的一般方法。它是与机器无关的,用磁带作为标准传输介质的独立方法。它提供了图象的单值转换,精度包括符号在内可以达到 32 位。对一维、二维、三维、甚至多维的数据类型都提供了合适的转换。它不仅适用于天文数据, 对其他学科的数据也是可用的。
#include "stdio.h"
#include "string.h"
#include <io.h>
#include <fcntl.h>
#include <stdlib.h>
#include "read.h"
struct bdata
{
char name[9];
char type[9];
};
void main()
{
int decimal, sign, precision = 10;
int tablen,fh,newfh,line=0,fline,ttime=0,time;
int fileno=0,tmpi=0,tmpj=0,tmpk=0,datasign=0;
long curpos=0,sof=0,datalnth=0;
char buffer[80]="",buffer2[11]="",*buffer3="",filename[80]="",head[6]="",*retn="\n";
char dd[8]="",ee[4]="",jj[4]="",ii[2]="",aa[1]="";
char ddtmp[9]="",eetmp[5]="",jjtmp[5]="",iitmp[3]="";
////////////////////////////////
double ddn=0;
float een=0;
long jjn=0;
int iin=0;
////////////////////////////////
printf("input the file NO:");
scanf("%d",&fileno);
strcpy(filename,"file");
_itoa(fileno,buffer,10);
strcat(filename,buffer);
strcat(filename,".dat");
ttime=getnum(filename);
tablen=getfield(filename);
getname(filename,buffer);
strcat(buffer,".dat");
fh = _open(filename,_O_RDONLY|_O_BINARY);
newfh=_open(buffer,_O_CREAT|_O_RDWR );
bdata *newtb;
newtb=new bdata[tablen];
/////////////////////////////////////////
sof=_filelength(fh);
fline=sof/16;
_lseek(fh,curpos,SEEK_SET);
_read(fh,buffer,80);
line+=5,curpos+=80;
strncpy(head,buffer,5);
head[5]='\0';
while(line<fline)
{
if(strcmp(head,"END ")==0)
{
datasign=1;
_write(newfh,buffer,80);
}
/////////////////////////////////////////////////reading data///////////////////////////
if(datasign==0)
{
if(strcmp(head,"TTYPE")==0)
{
for(tmpj=0;tmpj<8;tmpj++)
newtb[tmpi].name[tmpj]=buffer[11+tmpj];
newtb[tmpi].name[8]='\0';
}
if(strcmp(head,"TFORM")==0)
{
for(tmpk=0;tmpk<8;tmpk++)
{
newtb[tmpi].type[tmpk]=buffer[11+tmpk];
}
newtb[tmpi].type[8]='\0';
tmpi++;
}
_write(newfh,buffer,80);
_write(newfh,"\n",1);
_lseek(fh,curpos,SEEK_SET);
_read(fh,buffer,80);
line+=5,curpos+=80;
strncpy(head,buffer,5);
}
else //binary data begin reading
{
_write(newfh,"\nBINARY DATA:\n",14);
_lseek(fh,curpos,SEEK_SET);
_read(fh,buffer,16);
line++,curpos+=16;
buffer[16]='\0';
while(strcmp(buffer," ")==0)
{
_lseek(fh,curpos,SEEK_SET);
_read(fh,buffer,16);
line++,curpos+=16;
buffer[16]='\0';
}
line--,curpos-=16;
_lseek(fh,curpos,SEEK_SET);
for(time=0;time<ttime;time++)
{
for(tmpj=0;tmpj<tablen;tmpj++)
{
_write(newfh,newtb[tmpj].name,8);
_write(newfh,":\n",2);
for(tmpi=0;tmpi<readnum(newtb[tmpj].type);tmpi++)
{
switch(readchar(newtb[tmpj].type))
{
case 'A':
_read(fh,aa,1);
_write(newfh,aa,1);
break;
case 'D':
_read(fh,dd,8);
for(tmpk=0;tmpk<8;tmpk++)
ddtmp[tmpk]=dd[7-tmpk];
ddtmp[8]='\0';
ddn=readd(ddtmp);
buffer3 = _ecvt(ddn, precision, &decimal, &sign );
if(decimal>307||decimal<-307)
{
_write(newfh,"0.0000000\n",10);
}
else
{
if(sign!=0)
_write(newfh,"-",1);
buffer2[0]=buffer3[0];
buffer2[1]='.';
for(tmpk=2;tmpk<=10;tmpk++)
buffer2[tmpk]=buffer3[tmpk-1];
_write(newfh,buffer2,11);
_write(newfh,"E",1);
_itoa(decimal-1,buffer3,10);
if(decimal>=1)
_write(newfh,"+",1);
_write(newfh,buffer3,getnlnth(decimal-1));
_write(newfh,retn,1);
}
break;
case 'E':
_read(fh,ee,4);
for(tmpk=0;tmpk<4;tmpk++)
eetmp[tmpk]=ee[3-tmpk];
eetmp[4]='\0';
een=reade(eetmp);
buffer3 = _ecvt(een, precision, &decimal, &sign );
if(decimal>37||decimal<-37)
{
_write(newfh,"0.0000000\n",10);
}
else
{
if(sign!=0)
_write(newfh,"-",1);
buffer2[0]=buffer3[0];
buffer2[1]='.';
for(tmpk=2;tmpk<=10;tmpk++)
buffer2[tmpk]=buffer3[tmpk-1];
_write(newfh,buffer2,11);
_write(newfh,"E",1);
_itoa(decimal-1,buffer3,10);
if(decimal>=1)
_write(newfh,"+",1);
_write(newfh,buffer3,getnlnth(decimal-1));
_write(newfh,retn,1);
}
break;
case 'J':
_read(fh,jj,4);
for(tmpk=0;tmpk<4;tmpk++)
jjtmp[tmpk]=jj[3-tmpk];
jjtmp[4]='\0';
jjn=readj(jjtmp);
ltoa(jjn, buffer, 10 );
_write(newfh,buffer,strlen(buffer));
_write(newfh,retn,1);
break;
case 'I':
_read(fh,ii,2);
for(tmpk=0;tmpk<2;tmpk++)
iitmp[tmpk]=ii[1-tmpk];
iitmp[2]='\0';
iin=readi(iitmp);
itoa(jjn, buffer, 10 );
_write(newfh,buffer,strlen(buffer));
_write(newfh,retn,1);
break;
}
}
_write(newfh,"\n",1);
}
}
_close(newfh);
_close(fh);
exit(0);
}
}
}
#include "stdio.h"
#include "string.h"
#include "split.h"
#include <io.h>
#include <fcntl.h>
#include <stdlib.h>
void main()
{
FILE *fp;
int fh,partfh=-1,mark=0;
long sof,curpos=0,line=0,fline=0;
char tmp[16],tmp9[10],buffer[3],newfn[80]="",fname[80]="",fitsname[80]="";
printf("input the filename:");
gets(fitsname);
fh = _open(fitsname, _O_RDONLY|_O_BINARY );
sof=_filelength(fh);
fline=sof/16;
while(line<fline)
{
_lseek(fh,curpos,SEEK_SET);
_read(fh,tmp,16);
strncpy(tmp9,tmp,9);
tmp9[9]='\0';
if(line==0&&strcmp(tmp9,"SIMPLE =")!=0)
{
printf("it is not a FITS file");
exit(0);
}
if(strcmp(tmp9,"SIMPLE =")==0||strcmp(tmp9,"XTENSION=")==0)
{
if(partfh!=-1)
_close(partfh);
mark++;
strcpy(newfn,"");
strcat(newfn,"file");
_itoa(mark,buffer,10);
strcat(newfn,buffer);
strcat(newfn,".dat");
partfh=_open(newfn,_O_CREAT|_O_RDWR|_O_BINARY );
}
_write(partfh,tmp,16);
line++;
curpos+=16;
}
_close(partfh);
_close(fh);
fp=fopen("index.dat","w+");
fprintf(fp,"(flie1.dat) PRIMARY \n");
for(fh=2;fh<=mark;fh++)
{
strcpy(newfn,"");
strcat(newfn,"file");
_itoa(fh,buffer,10);
strcat(newfn,buffer);
strcat(newfn,".dat");
strcpy(fname,"");
getname(newfn,fname);
fprintf(fp,"(file%d.dat) XTENSION: %s DIMENSION: %d * %d\n",fh,fname,getfield(newfn),getnum(newfn));
}
fclose(fp);
}