Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con la gestione di valori Hex
Forum - C/C++ - Problema con la gestione di valori Hex - Pagina 3

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:38
Venerdì, 01/07/2011
Testo quotato

Postato originariamente da Roxas75:

... ho aggiunto solo una piccola cosa per riuscire a vederne i risultati, che poi è stata la causa dell'errore......



Imparare significa

1) chiedersi ... è possibile che mi abbiano suggerito un codice sbagliato?

2) leggere e rileggere i messaggi d'errore ... (che poi era uno solo ...)

3) scoprire, con meraviglia, che si riferisce all'unica linea aggiunta ...

4) chiedersi il perché e cercare di eliminare il problema

ma SOPRATTUTTO

chiedersi ... che "metodo" ha usato questo che mi ha suggerito il codice? Cosa vuol dire

char *txt = mem+(*((short *)(mem+24)));

??

Puo' darsi che questo metodo mi possa aiutare ?



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Roxas75 (Normal User)
Newbie


Messaggi: 15
Iscritto: 01/07/2011

Segnala al moderatore
Postato alle 21:12
Venerdì, 01/07/2011
si in effetti avrei anche voluto chiedertelo, in effetti non sono proprio sicuro di averne interpretato il significato...
e comunque ve l'ho detto che non ho molta dimestichezza sugli argomenti che non siano basilari, senza contare che uso un compilatore diverso da prima da poche ore...
in fin dei conti sn ankora nabbo per certe cose...

Ultima modifica effettuata da Roxas75 il 01/07/2011 alle 21:16
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 21:18
Venerdì, 01/07/2011
lo sai che dopo 3 "ankora" di seguito ti scoppia il computer? uomo avvisato... :yup:

PM Quote
Avatar
Roxas75 (Normal User)
Newbie


Messaggi: 15
Iscritto: 01/07/2011

Segnala al moderatore
Postato alle 21:23
Venerdì, 01/07/2011
afferrato...:yup:

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:53
Venerdì, 01/07/2011
Testo quotato

Postato originariamente da Roxas75:
EDIT: ugualmente, ci sono tornato su dopocena e ho modificato il tuo codice, aggiungendo un ciclo e la possibilità di prendere tutte le stringhe...
però a un certo punto la stringa inizia a riempirsi di errori e mostra simboli incomprensibili...



Quale codice hai usato? Cosa hai aggiunto?

Testo quotato

se sei disposto ankora ad aiutarmi te ne sarei grato, altrimenti grazie comunque per l'aiuto!^^



Guarda questo esempio

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4.  
  5. int main()
  6. {
  7.   FILE *f = fopen("input.ctd", "rb");
  8.   fseek(f, 0, SEEK_END);
  9.   int sz = ftell(f);
  10.  
  11.   char *mem = (char *)malloc(sz);
  12.  
  13.   fseek(f, 0, SEEK_SET);
  14.   int r = fread(mem, sizeof(char), sz, f);
  15.   fclose(f);
  16.  
  17.   int limit = *((short *)(mem+0x14));
  18.  
  19.   int ix = 0x18;
  20.   int next = *((short *)(mem+ix));
  21.  
  22.   while(ix<limit)
  23.   {
  24.     char *txt = mem+next;
  25.     printf("%X -> %X : %s\n", ix, txt-mem, txt);
  26.     ix += 0x0C;
  27.     next = *((short *)(mem+ix));
  28.   }
  29.  
  30.   free(mem);
  31.  
  32.   return 0;
  33. }


Ultima modifica effettuata da nessuno il 02/07/2011 alle 11:54


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:04
Sabato, 02/07/2011
Qual'è la stringa alla quale sbaglia?

(Domanda alquanto lecita....)

Hai provato a vedere manualmente qual'è il valore sul file?

Es: sul file che hai condiviso su mediafire qual'è la stringa alla quale si blocca e il puntatore ad essa?

PM Quote
Avatar
Roxas75 (Normal User)
Newbie


Messaggi: 15
Iscritto: 01/07/2011

Segnala al moderatore
Postato alle 12:07
Domenica, 03/07/2011
Scusate l'attesa, ma ero fuori casa tutto ieri...
Ugualmente, posto qui il codice che usavo io.
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.     #include <fstream>
  3.     #include <malloc.h>
  4.     #include <stdlib.h>
  5.  
  6.     int main()
  7.     {
  8.       FILE *f;
  9.       FILE *o;
  10.       f = fopen("in", "r");
  11.       o = fopen("out.txt", "w");
  12.           int counter = 0;
  13.       fseek(f, 0, SEEK_END);
  14.       int sz = ftell(f);
  15.           char *txt;
  16.       char *mem;
  17.       mem = (char *)malloc(sz);
  18.           int localize = 36;
  19.       while(counter < 200)
  20.           {
  21.           mem = (char *)malloc(sz);
  22.       fseek(f, 0, SEEK_SET);
  23.       fread(mem, sizeof(char), sz, f);    
  24.       txt = mem+(*((short *)(mem+localize)));
  25.       counter++;
  26.       fprintf(o, "%d-%s\n", counter, txt);
  27.       free(mem);
  28.           txt = "\0";
  29.           localize+=12;
  30.           }
  31.       return 0;
  32.     }


Ho provato il codice consigliatomi, e va alla perfezione! Vorrei però chiarire un paio di dubbi che mirimangono, se avete la possibilità di spiegarmeli...
Riscrivo qui sotto il codice di nessuno e metto delle freccette sulle righe che misembrano dubbie.
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.     #include <string.h>
  3.     #include <malloc.h>
  4.      
  5.     int main()
  6.     {
  7.       FILE *f = fopen("in", "rb");
  8.       fseek(f, 0, SEEK_END);
  9.       int sz = ftell(f);
  10.      
  11.       char *mem = (char *)malloc(sz);
  12.      
  13.       fseek(f, 0, SEEK_SET);
  14.       int r = fread(mem, sizeof(char), sz, f);
  15.       fclose(f);
  16.      
  17.       int limit = *((short *)(mem+0x14));            <-----non capisco short* etc...
  18.      
  19.       int ix = 0x18;
  20.       int next = *((short *)(mem+ix));            <-----anche qui...
  21.      
  22.       while(ix<limit)
  23.       {
  24.         char *txt = mem+next;     <--non capisco come questo porti alla stringa
  25.         printf("%X -> %X : %s\n", ix, txt-mem, txt); <---cosa è txt-mem?:-?
  26.         ix += 0x0C;
  27.         next = *((short *)(mem+ix));              <---come sopracitato
  28.       }
  29.      
  30.       free(mem);
  31.       return 0;
  32.     }


Grazie mille di tutto!^^

Ultima modifica effettuata da Roxas75 il 03/07/2011 alle 12:09
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:30
Domenica, 03/07/2011
Codice sorgente - presumibilmente C/C++

  1. int limit = *((short *)(mem+0x14));


limit viene forzato per considerare il valore 20 byte (0x14) dopo l'inizio del file come puntatore ad un short il cui contenuto viene messo in limit così che limit valga la distanza dall'inizio alla stringa

Codice sorgente - presumibilmente C/C++

  1. int next = *((short *)(mem+ix));


next vale come sopra ma all'indirizzo 0x18 dopo l'inizio del file

Codice sorgente - presumibilmente Plain Text

  1. txt - mem


è la DISTANZA dall'inizio del file della stringa cercata

Codice sorgente - presumibilmente C/C++

  1. next = *((short *)(mem+ix));


siccome prima viene incrementato ix di 0x0C next è il valore (puntatore) successivo (che poi viene sommato all'indirizzo iniziale del file letto mem per poter trovare l'indirizzo reale in Memoria (e non nel file) della stringa)

Mi accorgo di non essere stato molto chiaro ma non trovo altri modi per spiegarlo, scusatemi ;)

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo