Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Community > Tech
 
[C]problema con array
Clicca QUI per vedere il messaggio nel forum
fabpicca
sto scrivendo un trigger per postgres che ha tra gli altri scopi quello di controllare che due campi di un record siano uguali a mezzo del loro md5.

per tale scopo ho scritto (attingendo dal web) la seguente funzione:

code:
char *md5(char *string){ MD5_CTX hash_state; static unsigned char md5buf[32]; int i; for(i=0;i<32;i++){ // array initialization md5buf[i]=' '; } //begin MD5 hash stuff MD5_Init(&hash_state); MD5_Update(&hash_state,string,strlen(string)); MD5_Final(md5buf, &hash_state); for(i=15;i>=0;i--){ md5buf[i*2+1]=(md5buf[i] & 0xf) + '0'; md5buf[i*2]=(md5buf[i] >> 4) +'0'; } for(i=0;i<32;i++){ if(md5buf[i]>'9') md5buf[i] += 0x27; } return md5buf; }


la seguente è così prototipata:

code:
char *md5(char *);


e viene utilizzata in questo modo:

code:
query = (char*) malloc(200); sprintf(query,"SELECT * FROM \"Anagrafica\" WHERE md5_hash='%s'",md5(rs3));


dove rs3 è un puntatore a carattere che contiene i dati provenienti dalla tupla da inserire nel Db.


Detto questo, il problema è che per un qualche strano motivo l'output di md5 non è corretto. Mi spiego.
Ottengo si l'md5, ma ho come trailing characters del garbage per un ammontare totale di 11 caratteri, per cui sostanzialmente istanzio nella funzione un array di 32 "spazi" e ne ottengo uno di 43, che ovviamente invalida il costraint imposto dal trigger che si basa su risultato della SELECT suindicata.

Per la precisione i caratteri inutili sono sempre gli stessi, guardando i log ottengo infatti una cosa di questo tipo:
code:
NOTICE: trgupdana(rs3): SELECT * FROM "Anagrafica" WHERE md5_hash='43a1347c1b4efa8b253aa489f3c61ba21:3.3.5-13)'


la stringa di caratteri '1:3.3.5-13)' è quella che si ripete sempre alla fine di ogni md5 che estraggo. la porzione prima di questa stringa è l'md5 effettivo ed è giusto.

Non essendo un esperto di C vi chiedo per favore un aiutino! Grazie!

Col. Kurtz
In C le stringhe terminano con il valore 0.
Dichiara md5buf con un carattere in più, e quando hai riempito il tuo array metti in ultima posizione lo 0.

Tipo

code:
char *md5(char *string){ MD5_CTX hash_state; static unsigned char md5buf[33]; int i; for(i=0;i<32;i++){ // array initialization md5buf[i]=' '; } //begin MD5 hash stuff ... md5buf[32] = 0; return md5buf; }

fabpicca
worked like a charm!

grazie mille caro!!!
ora un fatto è certo...io e il c viaggiamo su binari diversi :asd:

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate