Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicitÓ e servizi in linea con il tuo account. 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: 5475
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 ...
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: 1787
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.


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
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 ...
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: 5475
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 ...
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo