Roxas75 (Normal User)
Newbie
Messaggi: 15
Iscritto: 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!^^
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
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à. |
|
Roxas75 (Normal User)
Newbie
Messaggi: 15
Iscritto: 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...
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
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.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
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à. |
|
Roxas75 (Normal User)
Newbie
Messaggi: 15
Iscritto: 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?
|
|
()
Newbie
Messaggi:
Iscritto:
|
Il valore è salvato dritto, è la cpu a invertirlo se lo leggi come un numero con segno! prova con unsigned
|
|
Roxas75 (Normal User)
Newbie
Messaggi: 15
Iscritto: 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++ |
FILE *input;
input = fopen("file.dat", "r");
int indirizzo;
char valore1, valore2;
char stringa[50];
fseek(input, 24, SEEK_SET);
valore2 = fgetc(input);
valore1 = fgetc(input);
indirizzo = (valore2*0x100) + valore1;
fseek(input, indirizzo, SEEK_SET);
fgets(stringa, 50, input);
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 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
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à. |
|