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

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Roxas75 (Normal User)
Newbie


Messaggi: 15
Iscritto: 01/07/2011

Segnala al moderatore
Postato alle 16:45
Venerdì, 01/07/2011
Salve a tutti, sono nuovo, ma trovo questo forum molto completo.
Per la maggior parte dei miei lavori mi dedico all'hacking dei videogiochi (cosa comunque non illegale).
Programmo in C e C++ non da molto, ho abbastanza dimestichezza con quello che so, ma non sono a un livello avanzato, ad esempio ho molti problemi coi puntatori... ma me la cavo....
Tornando a noi ho un problema che non riesco a risolvere (per chi seguisse l'hacking dei giochi si tratta dei puntatori...).
In un file mi ritrovo una stringa di testo che non va a capo, quindi molto semplice...
Per sapere in quale offset si trova la stringa, il file contiene dei valori, però al contrario! Per esempio, se ci trovassimo di fronte una stringa che inizia all'offset 1A3B, il valore starà scritto 3B1A.
Quindi il concreto problema sta nel capovolgere le due coppie di numeri, sempre contandoli in esadecimale, per poi passare il risultato a una funzione fseek.
La particolarità è che questi valori non sono scritti esplicitamente, ma racchiusi in 2 byte, come due caratteri(come ad esempio se ci fosse scritto AB i valori sarebbero 4142 in hex...).
Ho fatto molti tentativi, non sto a postarli tutti... a voi la parola e grazie in anticipo!^^:)

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:55
Venerdì, 01/07/2011
Sono semplici interi a 16 bit (con o senza segno) che stanno in memoria nel tipico formato little-endian... ma non ho capito qual è il problema nel leggerli ...


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 17:02
Venerdì, 01/07/2011
Il vero problema per me è ottenere un int con le coppie di valori girati...
Ho provato a registrarli in due char, per poi sommare il valore del primo al valore del secondo moltiplicato per 0x100, ma a volte il risultato veniva creato male...:_doubt:

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 17:09
Venerdì, 01/07/2011
il PC che usi tutti i giorni è una macchina Little Endian. Leggi il dato come unsigned short e sarà la stessa CPU a "ribaltare" i due byte al posto tuo. Se invece li leggi come char devi invertirli a mano.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:10
Venerdì, 01/07/2011
Forse è meglio che tu ci faccia vedere cosa fai e quale codice usi ...


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 17:12
Venerdì, 01/07/2011
Quindi se io utilizzassi funzioni come fscanf o fread e registrassi tutto in un unsigned short tutto si farebbe da solo? Se ci sono funzioni migliori me le potreste consigliare?

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:20
Venerdì, 01/07/2011
Il valore è salvato dritto, è la cpu a invertirlo se lo leggi come un numero con segno! prova con unsigned

PM Quote
Avatar
Roxas75 (Normal User)
Newbie


Messaggi: 15
Iscritto: 01/07/2011

Segnala al moderatore
Postato alle 17:21
Venerdì, 01/07/2011
Io fino a ora lavoravo con questo tipo di codice, lo riassumo un po' perchè non ce l'ho sotto mano purtroppo...
Codice sorgente - presumibilmente C/C++

  1. FILE *input;
  2. input = fopen("file.dat", "r");
  3. int indirizzo;
  4. char valore1, valore2;
  5. char stringa[50];
  6.  
  7. fseek(input, 24, SEEK_SET);
  8. valore2 = fgetc(input);
  9. valore1 = fgetc(input);
  10. indirizzo = (valore2*0x100) + valore1;
  11. fseek(input, indirizzo, SEEK_SET);
  12. fgets(stringa, 50, input);
  13. printf("%s", stringa);


Questo codice funzionava per alcune delle tante stringhe che il file contiene, ma nella maggior parte dei casi indirizzo viene calcolato male, e la stringa e presa a metà del dovuto o il programma crasha...
Provvedo a provare il metodo che mi avete consigliato il prima possibile, sto installando un nuovo compilatore, tra 5 minuti ne avrò la possibilità.^^

Ultima modifica effettuata da Roxas75 il 01/07/2011 alle 17:23
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:26
Venerdì, 01/07/2011
Il problema non è come calcoli i valori ma nei punti di ingresso che utilizzi.

Chi ti dice che

24

sia il valore corretto da cui prelevare i dati?

In ogni caso, dovresti caricare in un buffer di memoria i byte che ti servono (con una fread) e poi leggere, ad esempio, com

short int v = *((short int *)mem);


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
Pagine: [ 1 2 3 4 ] Precedente | Prossimo