Newsgroup: it.comp.lang.c
Titolo: riempire in array

Mi trovo in questa condizione.
prendo un campo digitato composto da nanocomandi del tipo:
D03ABB(io lo prendo come stringa è corretto?)
questo campo lo devo mettere in un array di BYTE in modo da ottenere
il seguente :
BYTE mioarray[] = { 0xD0, 0x3A, 0xBB};
Mi dite come fare
Saluti
Luca


Immagino tu debba fare qualcosa del genere:
1 - prendi in input una stringa
2 - prendi i caratteri della stringa due a due
3 - per ogni coppia di caratteri
3.1 - trasforma la coppia nel byte corrispondente
3.2 - accoda il byte all'array di output
4 - restituisci l'array
(manca completamente il controllo di errore, possibili
controlli sono sul numero di caratteri della stringa di input che
deve essere pari e sul numero di byte dell'array di output che
deve essere sufficiente)
comincia a costruire la funzione e poi se hai dei dubbi su come
implementare i vari passi posta qui il tuo codice e le tue domande
ciao
Giacomo

On 13 Gen, 11:14, Giacomo Degli Esposti

Ciao e grazie
1) come controllo se la lunghezza è pari
2) come trasformo le coppie di caratteri in byte
Saluti
Luca


Sul pari farei così:
scanf("%s",&scritta);
lunghezza = strlen(scritta);
if (lunghezza%2 != 0){
    printf("\nInserimento non corretto");}
    else {vado avanti
        }

 2) come trasformo le coppie di caratteri in byte
devi trasformare ogni carattere nel corrispondente numero
'0' -> 0
'1' -> 1
...
'A' -> 10
...
'F' -> 15
quindi quando dai due caratteri c1 e c2 hai ottenuto n1 e n2
il valore corrispondente lo ottieni con (n1*16+n2)
n1 = 4 bit alti, quindi va moltiplicato per 16
n2 = 4 bit bassi quindi non va moltiplicato
Per ottenere il numero devi ricordarti che in C i caratteri
sono effettivamente degli interi ('0' e' probabilmente 48,
dipende se sulla tua piattaforma e' usata la codifica ASCII o no)
quindi puoi fare le somme e sottrazioni: se c1 e' '7'
allora (c1-'0') == 7   (in ralta' e' come fare 55 - 48 == 7)
ciao
Giacomo



non completamente testato..
[code]
#include <stdio.h>
#include <stdlib.h>
#define ERR_STRING "Warning: not valid char `%c'.\n"
#define SIZE 16
#define SIZE_GROW_FACTOR 1.5
#define VALID_HEX(n) \
	((n >= '0' && n <= '9') || (n >= 'A' && n <= 'F'))
#define HEX_TO_INT(n) \
	((n >= '0' && n <= '9') ? n - '0' : n - 'A' + 10)
typedef char BYTE;
int main (void) 
{
	int size = SIZE;
	int c, d, cur = 0;
	BYTE * mioarray = malloc(sizeof(BYTE) * size);
 
	while ((c = getchar()) != EOF && (d = getchar()) != EOF) {
		if (!VALID_HEX(c)) {
			fprintf(stderr, ERR_STRING, c);
			ungetc(d, stdin);
			continue;
		}
		if (!VALID_HEX(d)) {
			fprintf(stderr, ERR_STRING, d);
			continue;
		}
		if (cur == size) {
			size *= SIZE_GROW_FACTOR;
			mioarray = realloc(mioarray, size);
		}
 
		mioarray[cur] = HEX_TO_INT(c);
		mioarray[cur] <<= 4;
		mioarray[cur] |= HEX_TO_INT(d);
		cur++;
	}
	size = cur;
	mioarray = realloc(mioarray, size);
 
	for (cur = 0; cur < size; cur++) {
		printf("0x%02hhX ", (char) mioarray[cur]);
	}
 
	printf("\n");
 
	return 0;
 
}
[/code]
-- 
www.iuz-lab.info

 			mioarray = realloc(mioarray, size);
MAI riallocare in questo modo, � stato detto centinaia di volte.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 MAI riallocare in questo modo, è stato detto centinaia di volte.
purtroppo non sono un frequentatore cosi' assiduo da sapere quello che 
intendi, ma penso che tu volessi dire che si dovrebbe usare una variabile 
temporanea per il valore di ritorno di realloc..
grazie delle correzioni e dei commenti :-)
-- 
www.iuz-lab.info

 temporanea per il valore di ritorno di realloc..
S�, esatto.


 [CUT]
Tutte queste linee per la conversione sono uno spreco: ci sono le
funzioni di libreria appositamente. I formati riconosciuti dalle
*printf sono riconosciuti anche dalle *scanf. Per il caso particolare
è sufficiente questo:
for( i = 0; i < strlen(..); i+=2 )
   if( !sscanf( &str[i], "%2x%n", &result[i/2], &n) || n != 2 )
      { / * errore * / }
Ciao
Giacomo

    if( !sscanf( &str[i], "%2x%n", &result[i/2], &n) || n != 2 )
ah beh, leggibilissimo!
Ciao Jack

    if( !sscanf( &str[i], "%2x%n", &result[i/2], &n) || n != 2 )
Tipica perversione del C-ista incallito.


 peggio in fatto di illeggibilit� :D
Ma s�, ma s�, lo IOCCC lo conosciamo...


 questo articolo e` stato inviato via web dal servizio gratuitohttp://
www.newsland.it/newssegnala
 gli abusi ad 
ab...@newsland.it
Io lo ho risolto così lo so che sicuramente non è il modo migliore
anzi son quasi sicuro che sia il peggiore, ma non sono un
programmatore e quindi non cazziatemi di brutto:
char scrivo[256];
int lunghezza;
char *to = (char*) malloc(3);
int coppie,zz;
int hex = 0;
scanf("%s",&scrivo);
lunghezza = strlen(scrivo);
coppie = lunghezza/2;
BYTE mio_dizio[coppie];
if (lunghezza%2 != 0){
	    printf("\nNon hai inserito correttamente la stringa la lunghezza
è dispari");
	    opzioni();}
    else {
        ss=0;
        for (zz=0;zz<lunghezza;zz+=2){
            strncpy(to, scrivo+zz,2);
            sscanf(to, "%X", &hex);
            mio_dizio[ss] = hex;
            ss = ss+1;
            }
Saluti
Luca