[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: |
|
|
|