| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
ripperiraspi 22.07.03 13:23 Tällä voi pätkiä isommista tiedostoista dataa annettujen offsettien perusteella.
/* 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. |
![]() Haku
|