/* ************************************************************* * * * WOODS HOLE OCEANOGRAPHIC INSTITUTION * * UPPER OCEAN PROCESSES GROUP * * PHYSICAL OCEANOGRAPHY DEPT. * * WOODS HOLE, MASSACHUSETTS USA 02543 * * * * File: vswrswab.c Model: - * * * * Function: VOS SWR binary data file byte swap utility * * * * Project: VOS * * * * Programmer: G.A. * * * * Copyright (c) 2007 Woods Hole Oceanographic Institution * * * ************************************************************* */ /* Additional reserved words not recognized by Source Print. uchar */ /* * Program to do two-byte and four-byte swapping on an input * file and produce a binary output file. Must match VOS SWR * data format... * * This program was designed to run on * binary MET file before producing ascii files using * "vswrasc" in the PC environment. * * Usage: vswrswab inputfile outputfile */ #include #include main(int argc,char *argv[]) { short int ret; short int j; char buff[4]; FILE *fd1,*fd2; if (argc < 3) { printf("Usage: vswrswab inputfile outputfile\n"); exit(-1); } /* handle input file */ fd1 = fopen(argv[1],"rb"); if ( fd1 == NULL ) { printf("Usage: vswrswab inputfile outputfile\n"); exit(-1); } /* handle output file */ fd2 = fopen(argv[2],"wb"); if ( fd2 == NULL ) { printf("Usage: vswrswab inputfile outputfile\n"); exit(-1); } /* main loop */ while(1) { /* first 8 bytes are time stuff - only swap last 2 bytes (year) */ for (j=0; j<6; j++) { /* read a character */ ret = fread(&buff[0],sizeof(char),1,fd1); if ( ret != 1 ) goto end; /* write the character */ fwrite(&buff[0],sizeof(char),1,fd2); } /* swap year bytes */ ret = fread(&buff[1],sizeof(char),1,fd1); if ( ret != 1 ) break; ret = fread(&buff[0],sizeof(char),1,fd1); if ( ret != 1 ) break; /* write bytes in 1,2 order */ fwrite(&buff[0],sizeof(char),1,fd2); fwrite(&buff[1],sizeof(char),1,fd2); /* next 240 bytes are big-endian float (60 floats CFLASH) - swap */ for (j=0; j<60; j++) { /* read 4 characters */ ret = fread(&buff[3],sizeof(char),1,fd1); if ( ret != 1 ) goto end; ret = fread(&buff[2],sizeof(char),1,fd1); if ( ret != 1 ) goto end; ret = fread(&buff[1],sizeof(char),1,fd1); if ( ret != 1 ) goto end; ret = fread(&buff[0],sizeof(char),1,fd1); if ( ret != 1 ) goto end; /* write 4 characters in opposite order */ fwrite(&buff[0],sizeof(char),1,fd2); fwrite(&buff[1],sizeof(char),1,fd2); fwrite(&buff[2],sizeof(char),1,fd2); fwrite(&buff[3],sizeof(char),1,fd2); } /* next 4 bytes are unused - don't swap */ for (j=0; j<4; j++) { /* read a character */ ret = fread(&buff[0],sizeof(char),1,fd1); if ( ret != 1 ) goto end; /* write the character */ fwrite(&buff[0],sizeof(char),1,fd2); } /* last 4 bytes are short int - swap 2 on 2 shorts; get bytes in 2,1 order */ for (j=0; j<2; j++) { ret = fread(&buff[1],sizeof(char),1,fd1); if ( ret != 1 ) break; ret = fread(&buff[0],sizeof(char),1,fd1); if ( ret != 1 ) break; /* write bytes in 1,2 order */ fwrite(&buff[0],sizeof(char),1,fd2); fwrite(&buff[1],sizeof(char),1,fd2); } } end: fclose(fd1); fclose(fd2); }