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 + -
显示快捷键?