|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
[C++] creare un array unsigned char concatenato
Salve a tutti.
Vi posto questa domanda più specifica di come è stata trattata da altre parti, con la speranza che qualcuno mi sappia aiutare. Come si fa il concatenamento di array "unsigned char"?? Non è possibile farlo con strcat, perchè non sono caratteri, ma debbono rimanere byte...quindi non mi dite di fare stringhe di caratteri o altro, perchè si perde il valore di quello che contiene il vettore, cioè bit. Nè penso si possa usare un casting, perchè complica le cose dopo nel ritornare unsigned, tipo come mi è stato detto da un'altra parte fare una strcat((char*)vett1,(char*)vett2) dove vett1 e vett2 sono unsigned. Vi spiego con un esempio di cosa ho e cosa voglio: Devo inviare un buffer unsigned char da 8 byte. Però devo ottenerlo da diversi piccoli array sempre unsigned. In pratica, ad esempio ho: unsigned char DLEN[1]={0x01}; unsigned char CMD[1]={0x05}; unsigned char DATA[4]={0x00,0x92,0x4f,0x81} unsigned char CRC[2]={0x92,0x31} e devo ottenere unsigned char buffer[8]={0x01,0x05,0x00,0x92,0x4f,0x81,0x92,0x31} E' così che deve essere il risultato. Come si fa? Come è possibile ottenere una cosa del genere??Aiutatemi!
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#2 | |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
Copia semplicemente i vari array nell'array finale, o assegnando direttamente il valore (buffer[0] = DLEN[0]) oppure tramite memcpy, campo per campo, tenendo traccia di dove stai copiando tramite un puntatore (puoi farti una funzione per generalizzare la cosa ovviamente). Ancora meglio sarebbe tenere i 4 campi in una struttura (allineata al byte). In quel modo ti basta una memcpy e la cosa risulta decisamente più elegante. |
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
Come ti ha suggerito ESSE-EFFE, bit fields: http://msdn.microsoft.com/en-us/libr...=vs.71%29.aspx
Comunque se fai il cast utilizzando static_cast non cambiano i bit ma solo l'interpretazione.
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 |
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
|
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
Ho travisato l'uso della struttura. :P
Però se mette i quattro unsigned char in un int dentro una struttura ottiene una singola word con tutti i bit configurati come vuole. Ah già, lui vuole un unsigned char .....
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 Ultima modifica di __ZERO_UNO__ : 29-03-2012 alle 21:09. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Ok, penso di aver capito l'antifona...devo fare delle prove....ed il bello è, che alcuni di questi unsigned char devono essere immessi da tastiera da un probabile utente, pertanto, come mi consigliate di farglieli acquisire?
Nel senso: messo che devo far mettere al mio utente 4 di quei bit, avevo pensato a cin.getline, però non so se ottengo quello che mi serve, l'utente dovrebbe inserirli con lo spazio, o con la virgola tra loro? Che tipo uso per l'introduzione? Cosa gli faccio acqusire un int e poi lo devo trasformare in esadecimale? (quei 4 bit dovrebbero rappresentare una posizione in mm o una corrente in mA) Oppure devo fargli introdurre direttamente un unsigned char pezzo a pezzo (4 volte quindi).
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#7 | ||
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
Quote:
|
||
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
"Immetti i parametri : " e l'utente scrive "00 00 41 22" ? Quote:
Quello che non mi è chiaro è: ma se all'utente è chiesto di immettere un valore, e l'utente immette "12" (immissione classica cin>>i , con i di tipo int) quando vado a copiarlo nella posizione "tot" dell'array unsigned char, il compilatore in fase di runtime converte automaticamente il valore in byte? Nella sua rappresentazione esadecimale? Cioè mi ritroverò dentro all'array il valore "0C"? Perchè è sta cosa che non capisco bene...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
||
|
|
|
|
|
#9 | |||
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
Quote:
Quote:
|
|||
|
|
|
|
|
#10 |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21840
|
ti mancano proprio le basi
comunque 1) mai usare cin per acquisire un intero se per sbaglio l'utente preme una lettera il programma crasha 2)acquisisci una stringa di testo con cin.getline, la converti in un intero con atoi mentre per scriverla in esadecimale nel vettore usa sprintf, se invece lavori su un output (es file o file di periferica) puoi usare tranquillamente hex
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Non deve convertire il dato in esadecimale per scriverlo nel vettore.
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
a me mancheranno anche le basi, ma a quanto pare non c'è accordo su questa cosa.
Anche perchè sprintf io l'ho usata e con l'unsigned char non ci vuole avere a che fare...insomma, mi creava all'interno del vettore simboli strani...eppure mi sono visto la guida reference su sito cplusplus, è un'ottima funzione per l'output, personalizzabile persino quante cifre prima e dopo lo zero, però è per stringhe, caratteri...qua invece devono essere byte. Qualcuno mi dice una volta per tutte in modo chiaro, se devo convertire l'intero acquisito prima di immetterlo nel vettore, oppure posso fare direttamente l'assegnazione e ritrovarmelo (quando vado ad inviarlo alla porta seriale) nel formato corretto?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Non lo devi convertire. Vuoi toglierti il dubbio? Prova...
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
buona giornata!!
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#15 | |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
Al volo al volo, mi dici una cosa? Come faccio la conversione da unsigned char a float? Il casting per avere a video il valore in float di un array unsigned char come si fa??
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#17 | |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
Il valore "float" di un "unsigned char" è ancora lo stesso valore. |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
unsigned char dat[]={0x00 ,0x00 ,0x20 ,0x41} dovrebbe corrispondere all'invio di "posizione 10 mm" come faccio a vedere se corrisponde a 10 (mm) oppure a 10x10-3 (ad esempio)?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#19 | |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
|
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12862
|
Quote:
Partiamo dalla teoria: Dimensioni dei tipi (dando per buona l'architettura a 32bit): Codice:
char 8 bit 1 byte int 32 bit 4 bytes long long 64 bit 8 bytes float 32 bit 4 bytes double 64 bit 8 bytes Ciò significa anche che questi 4 bytes possono essere interpretati come float. Tutto dipende da come dici tu di leggere quella sequenza di byte: Codice:
unsigned char Buffer[] = { 0x00, 0x00, 0x01, 0x01 };
float* F = (float*) Buffer;
int* I = (int*) Buffer;
printf("Buffer float %f\n", *F);
printf("Buffer int %d\n", *I);
Altrimenti basta un semplice cast, ma ottieni lo stesso valore, come diceva ESSE-EFFE. Ultima modifica di WarDuck : 30-03-2012 alle 15:31. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:37.




















