//cut macBinary #include #include #include #define uchar unsigned char #define ulong unsigned long #define FILENAMELEN 256 void errexit(char *s){ fprintf(stderr, "err: %s\n", s); exit(1); } // network order(Big Endian) to host order(Big/Little Endian); unsigned long ulong ntohl(ulong ul){ static int endian = 0; // initialize if(endian==0){ long n = 0x12345678; if(*(char *)(&n) == 0x12) endian = 1; //big endian, MSBfirst else endian = 2; //little endian, LSBfirst //printf("endian=%s\n", (endian==1)?"BigEndian":"LittleEndian"); } if(endian == 1){ // Big to Big return ul; }else{ // Big to Little uchar c[4]; int i; for(i=0; i<4; i++){ uchar *p = (uchar *)&ul; *(c+3-i) = *(p+i); } return *(ulong*)c; } } int main(int argc, char *argv[]){ FILE *fin, *fout; struct stat info; uchar *p; ulong headlen, newflen; char newfname[FILENAMELEN]; int i; if(argc != 2) errexit("macbincut filename"); /* * file open & read all */ if((fin=fopen(argv[1],"rb")) == NULL) errexit("fopen"); if(stat(argv[1], &info) != 0) errexit("stat"); if((p=malloc(info.st_size)) == NULL) errexit("malloc"); if(fread(p, 1, info.st_size, fin) != info.st_size) errexit("fread"); fclose(fin); /* * is mac header? */ if(*p!=0 || *(p+74)!=0 || *(p+82)!=0) errexit("This file don't have mac header. 1"); for(i=108; i<=115; i++){ if(*(p+i)!=0) errexit("This file don't have mac header. 2"); } headlen = 128 + ntohl(*(ulong*)(p+83)); //headlen = 128 + (*p<<24 | *(p+1)<<16 | *(p+2)<<8 | *(p+3)); //big endian p += headlen; newflen = info.st_size - headlen; /* * cut mac binary & save */ //new filename memset(newfname, 0x00, FILENAMELEN); sprintf(newfname, "new_%s", argv[1]); //file write if((fout=fopen(newfname,"wb")) == NULL) errexit("fopen 2"); if(fwrite(p, 1, newflen, fout) != newflen) errexit("fwrite"); fclose(fout); printf("saved '%s' cut %ld bytes\n", newfname, headlen); return 0; } //end of file