ripperi

raspi 22.07.03 13:23

Tällä voi pätkiä isommista tiedostoista dataa annettujen offsettien perusteella.

 Tekstiversio  Arvo: 1 (4 ääntä)  Äänestä: +  -
/*
ripperi

raspi 2003

auttajat:
e2prom, jpl

Käännä:
linux: gcc rip.cpp -o rip
win: bcc32 rip.cpp

todo:
EOF-parametri
*/

#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <string.h>

int ishex (char *c) { // hex?
  char cset[] = "1234567890abcdefABCDEF";
  if(strspn (c,cset) == strlen(c)) {
    return 1;
  } else {
    return 0;
  }
}

int isdec (char *c) { // dec?
  char cset[] = "1234567890";
  if(strspn(c,cset) == strlen(c)) {
    return 1;
  } else {
    return 0;
  }
}


void main(int argc, char **argv) {
  FILE *tiedosto; // mistä luetaan
  FILE *ulostulo; // mihin tallennetaan
  char tiednimi[255];
  char ulosfile[255];
  char *puskuri;
  double koko;
  double start;
  double end;
  int ii;

  start = 0;
  end = 1;
  ii = 2;
 
  if (argc == 5 && strcmp(argv[1], argv[4]) != 0) { // käydään läpi ensimmäinen parametri
    strcpy(tiednimi, argv[1]);
   
      if (*argv[ii] == 'x') { // hex
        *argv[ii] = '0';
        if(ishex(argv[ii])) {
          start = strtoul(argv[ii], NULL, 16); // hex -> dec
        } else {
          printf("err: %s ei ole heksaa!\n", argv[ii]);
          exit(2);
        }
      } else if (*argv[ii] > 0) { // dec
        if (isdec(argv[ii])) {
          start = atol(argv[ii]); // string -> long
        } else {
          printf("%s ei ole desimaali!\n", argv[ii]);
          exit(2);
        }
      } else { // err
        printf("mikä ihme %s on?\n", argv[ii]);
        exit(2);
      }

    ii++;

    if (argv[ii][0] == 'l') { // pituus on määritetty
      argv[ii][0] = '0';
      if (argv[ii][1] == 'x') { // hex
        argv[ii][1] = '0';
        if(ishex(argv[ii])) {
          end = strtoul(argv[ii], NULL, 16); // hex -> dec
        } else {
          printf("err: %s ei ole heksaa!\n", argv[ii]);
          exit(2);
        }
      } else if (*argv[ii] > 0) { // dec
        if (isdec(argv[ii])) {
          end = atol(argv[ii]); // string -> long
        } else {
          printf("%s ei ole desimaali!\n", argv[ii]);
          exit(2);
        }
      } else { // err
        printf("mikä ihme %s on?\n", argv[ii]);
        exit(2);
      }

      end = end + start;

    } else if (argv[ii][0] == 'x') { // hex
      argv[ii][0] = '0';
      if(ishex(argv[ii])) {
        end = strtoul(argv[ii], NULL, 16); // hex -> dec
      } else {
        printf("err: %s ei ole heksaa!\n", argv[ii]);
        exit(2);
      }
    } else if (*argv[ii] > 0) { // dec
      if (isdec(argv[ii])) {
        end = atol(argv[ii]); // string -> long
      } else {
        printf("%s ei ole desimaali!\n", argv[ii]);
        exit(2);
      }
    } else { // err
      printf("mikä ihme %s on?\n", argv[ii]);
      exit(2);
    }
   
    ii++;
    strcpy(ulosfile, argv[ii]);

    tiedosto = fopen(tiednimi, "rb"); // avataan tiedosto read + binary -moodissa

    if (tiedosto) {
      fseek(tiedosto, 0, SEEK_END); // mennään tiedoston loppuun
      koko = ftell(tiedosto); // otetaan selville tiedoston koko
     
      printf("lähdetiedosto: \"%s\"\n", tiednimi);
      printf("tiedoston koko: %ld tavua\n", koko);
      printf("offsetit %ld - %ld (kirjoitetaan %ld tavua)\n", start, end, end-start);
      printf("kohdetiedosto: \"%s\"\n", ulosfile);
     
      if(start < end || end < koko) {
        fseek(tiedosto, start, SEEK_SET); // mennään oikeaan kohtaan
        printf("varataan muistia..\n");
        puskuri = (char*) malloc (end-start); // varataan muistia

        if (puskuri == NULL) {
          printf("virhe: ei voitu varata muistia\n");
          exit (2);
        }

        fread(puskuri,1, end-start, tiedosto); // luetaan tietoa
        ulostulo = fopen(ulosfile, "wb");

        if (ulostulo) {
          printf("kirjotellaan fileeseen \"%s\" ..\n", ulosfile);
          fwrite(puskuri, 1, end-start, ulostulo);
        } else {
          printf("jotain häikkää fileessä \"%s\"\n", ulosfile);
          exit(2);
        }

        fclose(ulostulo); // suljetaan tiedosto

      } else {
        printf("virhe: loppuoffsetti on isompi kuin alkuoffsetti tai tiedoston koko\n");
        exit(2);
      }

    } else {
      printf("virhe: ei saatu tiedostoa \"%s\" auki\n", tiednimi);
      exit(2);
    }

    fclose(tiedosto); // suljetaan tiedosto
    free(puskuri); // vapautetaan muistia

  } else { // usage
    printf("Ripper v0.3 -- (c) raspi 2003\n");
    printf("USAGEZZ:\n%s <input> <start> <end> <output>\n", argv[0]);
    printf("DEC: %s foo.big 100 200 first.dat\n", argv[0]);
    printf("HEX: %s foo.big x2af xff8 second.dat\n", argv[0]);
    printf("LENGHT: %s foo.big xf lxf third.dat\n", argv[0]);
  }
}

vade 16:27 27.8.03 
x# on ainakin minulle outo heksanotaatio. 0x# tai #h.

Tyylisi on aika sekava, mutta kyllä tosta selvää saa. ishex- ja -dec-funktiot voisi puristaa nätimpään muotoon: return ( strcpn(c, "1234567890abcdefABCDEF") == strlen(c) );

.02
ane 18:01 6.12.03 
Niin ja standardikirjastoista löytyy isxdigit ja isdigit-funktiot.