arsave.c
来自「Archive Saver Could save Segment of an 」· C语言 代码 · 共 110 行
C
110 行
/* * archive saver * * Copyright (c) 2008, Veacheslav Patkov. * aLL rights reserved. * */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdarg.h>#define ARSAVE_VERSION "0.03"#define BUFSIZE 128*1024#define MAXSIGN 14typedef struct { char *name; char *ext; char *sign; unsigned char len; unsigned char offset;} signature;signature signs[] = { {"ZIP",".zip","\x50\x4b\x03\x04",4,0}, {"ZIP",".zip","\x50\x4b\x30\x30\x50\x4b",6,0}, {"RAR",".rar","\x52\x61\x72\x21",4,0}, {"CAB",".cab","\x4d\x53\x43\x46",4,0}, {"UHARC",".uha","\x55\x48\x41",3,0}, {"7-ZIP",".7z","\x37\x7a\xbc\xaf\x27\x1c",6,0}, {"ACE",".ace","\x2a\x2a\x41\x43\x45\x2a\x2a",7,7}, {0,0,0,0,0}};char *iname,oname[260],buf[BUFSIZE];void error(char *format, ...){ va_list ap; fprintf(stderr,"arsave: error: "); va_start(ap,format); vfprintf(stderr,format,ap); va_end(ap); fprintf(stderr,"\n"); exit(1);}int main(int argc, char **argv){ FILE *fi,*fo; unsigned int i,k,n = 0; char *p; if (argc == 1) { printf("archive saver version " ARSAVE_VERSION "\n" "usage: arsave [-s <start>] <input> [output]\n"); return 0; } if (!strcmp(argv[1],"-s")) { if (argc < 4) error("no input files"); else if ((int)(n = strtol(argv[2],0,16)) <= 0) error("incorrect argument for `-s' option: %s",argv[2]); argv += 2; argc -= 2; } iname = argv[1]; if (!(fi = fopen(iname,"rb"))) error("cannot open file `%s'",iname); if (n > 0) if (fseek(fi,n,SEEK_SET)) error("cannot seek file `%s' to offset %x",iname,n); while ((n = fread(buf,1,BUFSIZE,fi)) > 0) for (i = MAXSIGN, p = buf; i < n; i++, p++) for (k = 0; signs[k].name; k++) if (!memcmp(p+signs[k].offset,signs[k].sign,signs[k].len)) goto found; fprintf(stderr,"arsave: no archives found\n"); goto the_end; found: fprintf(stderr,"arsave: found %s archive (offset: 0x%08x)\n", signs[k].name,(unsigned int)ftell(fi)+i-n-MAXSIGN); if (argc == 2) { strcpy(oname,iname); strcat(oname,signs[k].ext); } else strcpy(oname,argv[2]); if (!(fo = fopen(oname,"wb"))) error("cannot open file `%s'",oname); fseek(fi,i-n-MAXSIGN,SEEK_CUR); while ((n = fread(buf,1,BUFSIZE,fi)) > 0) if (fwrite(buf,1,n,fo) != n) error("cannot write file `%s'",oname); fprintf(stderr,"arsave: saved to: %s\n",oname); fclose(fo); the_end: fclose(fi); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?