Newsgroup: it.comp.lang.c
Titolo: problema con le stringhe

sto utilizzando una funzione che mi restituisce il risultato in un vettore
di "unsigned char". Per lavorare meglio sui singoli bit, vorrei convertire
il vettore in una stringa, ma, essendo alle prime armi, non ci riesco.
Questo è il codice utilizzato (me l'hanno consigliato)
char *pchMessDigest;
pchMessDigest = (char*)malloc(20); //la stringa è di 160 bit, 20 bytes
unsigned char md_value[20];  //questo vettore viene riempito da una funzione
for(i = 0; i < 20; i++) {
                pchMessDigest = strcat(pchMessDigest, &md_value[i]);
}
sareste così gentili da spiegarmi dove sbaglio oppure fornirmi una soluzione
che mi consenta di lavorare sui singoli bit del vettore restituito?

 }
if ( (pchMessDigest = (char*)malloc(21))==NULL)
	exit(1);
for(i=0; i<20; i++)
	*(pchMessDigest+i)=md_value[i];
*(pchMessDigest+i)='\0';
ciao ...
-- 
#include <stdio.h>
int main(void){char c[]={10,65,110,116,111,110,105,111,32,98,97,114,98,111,110,
101,32,60,104,105,110,100,101,109,105,116,64,116,105,115,99,97,108,105,110,101,
116,46,105,116,62,10,10,0};printf("%s",c);return 0;}

 restituito?
Le variabili md_value e pchMessDigest sono vettori di char (signed o
unsigned importa poco), cioč SONO stringhe.
Per copiare una stringa in un'altra, di solito si fa cosě:
   strcpy(pchMessDigest, md_value);
Quanto ai singoli bit, con gli operatori booleani bit a bit puoi lavorare
sui singoli bit di *qualsiasi* cosa.
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 *(pchMessDigest+i)='';
Forse fra i due apici volevi metterci \0 (backslash e zero).
Comunque, il codice che hai scritto è esattamente quello che fa la
funzione strcpy.


 Cingar
Chiedo venia per la mia somma incompetenza.
strcpy funziona, come giustamente avevi detto, e restituisce lo stesso
risultato di quanto suggerito da Antonio.
Un' ultima cosa, Quando vado a stampare il contuto della stringa in questo
modo:
        for(i=0; i<20; i++) {
                printf("\n%02x",*(pchMessDigest+i));
        }       
ottengo uno strano risultato:
ffffffb0
6e
56
fffffff4
ffffffb7
32
ffffffb5
ffffff88
ffffff91
ffffffd0
fffffff8
0d
ffffffab
ffffffb0
ffffff8f
09
75
2c
62
38
I valori sono tutti giusti, ma quelle sequenze di ffffff non mi spiego
proprio da dove escano fuori, per giunta considerando che non sono presenti
in tutte le linee. Ho sbagliato il formattatore nella printf ???
Scusate ancora l'ignoranza, spero di non dovervi più disturbare.

 Cingar
ciao ;-)))


 non per fare polemiche ... e allora ??
E allora batti inutilmente due tasti in piů per ottenere un'espressione
piů difficile da capire.
Un po' come quelli che dicono "Quella che č la pappa addizionata con il
pomodoro" invece che "La pappa con il pomodoro"...


 Cingar
ciao ...


 funzione strcpy.
non per essere pignolo, ma la funzione che ha scritto
copia 20 caratteri, indipendentemente dal loro
contenuto.
La strcpy si ferma se trova uno zero.
Quindi se il "vettore di unsigned char" su quale TNT vuole
lavorare bit a bit puo' contenere degli zeri e'
sconsigliabile lavorare con strcpy e altre funzioni
che presuppongono il terminatore 0.
(per esempio, e' un errore che ho visto fare diverse volte
a quelli che manipolano i bit di una stringa per criptarla in
modo naif, tipo con uno XOR, e poi si ritrovano qualcosa
che non e' piu' manipolabile con le funzioni di string.h)
ciao,
e.

 e.
Ciao e grazie dell'intervento.
        TNT

 non sbaglia.
Temo tu abbia le idee molto confuse...
Guarda che il carattere 0 (che indicheremo con '0' per distingerlo
dal numero 0) non ci incastra assolutamente nulla. E' un carattere
come tutti gli altri.
Il terminatore 0 e' il valore numerico 0 (che di solito e'
rappresentato con tutti i bit a zero). E' questo che
indica la fine di una stringa per le funzioni di string.h
Il problema puo' nascere se vai a manipolare i
bit di una stringa (che altro non e' se non un array
di caratteri con in fondo uno 0).
Per esempio supponi di
avere la stringa "Ciao Pippo" nell'array X,
quindi X[0]='C', X[1]='i', fino a X[10]=0 che non e' '0', ma e'
il valore numerico ZERO e indica che la stringa e' finita.
Se tu manipoli i valori
per esempio:
char *p;
for (p=X; *p; p++) *p = *p ^ 'a';
facendo un bello XOR con il valore 'a' (e' una banale cifratura)
allora la 'a' di "Ciao..." diventa 0 (perche 'a' XOR 'a' = 0, bit a bit)
allora stai mettendo un terminatore nella posizione X[2] dove prima
c'era la 'a'. Se poi usi una funzione come strcpy per copiare la
tua stringa modificata copierai solo i primi 2 caratteri...
fidati.
ciao.
e.
PS. Bisogna urgentemente che ti compri
un buon libro di C (e magari anche uno di informatica per studiarti
le rappresentazioni binarie, visto che vai a lavorare sulla
rappresentazione).

 e.
ciao
TNT

 contenuto.
Già, già, me ne sono accorto solo dopo aver spedito.


 ascii table alla posizione 48 c'è proprio il carattere 0.
Dipende. Nulla obbliga un'implementazione C ad usare un encoding ASCII.
-- 
Mat/tia Belletti - Graduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003