Il tipo unsinged char
viene in genere utilizzato come rappresentazione di un singolo byte
di dati binari. Pertanto, e array viene spesso utilizzato come buffer di dati binari, in cui ogni elemento è un byte singolo.
Il costrutto unsigned char*
sarà un puntatore al buffer di dati binari (o al suo primo elemento).
Non sono sicuro al 100% cosa dice esattamente lo standard c++
sulla dimensione di unsigned char
, se è stato impostato su 8 bit o meno. Solitamente lo è. Proverò a trovarlo e a postarlo.
Dopo aver visto il codice
Quando si utilizza qualcosa come void* input
come parametro di una funzione, si striscia deliberatamente verso il basso le informazioni relative ingressi tipo di originale. Questo è un suggerimento molto forte che l'input sarà trattato in modo molto generale. Cioè come una stringa arbitraria di byte. int* input
d'altra parte suggerirebbe di essere trattato come una "stringa" di numeri interi singolati.
void*
è usato soprattutto in casi in cui ingresso viene codificato, o trattati bit
/byte
saggio per qualsiasi motivo, dal momento che non è possibile trarre conclusioni circa il suo contenuto.
Quindi nella tua funzione sembra che tu voglia trattare l'input come una stringa di byte. Ma per operare su oggetti, ad es. eseguendo operator=
(assegnazione) il compilatore deve sapere cosa fare. Dal momento che dichiarare l'input come assegnazione void*
come *input = something
non avrebbe senso poiché *input
è di tipo void
. Per fare in modo che il compilatore consideri gli elementi input
come "i pezzi di memoria grezza più piccoli", li trasmetti al tipo appropriato che è unsigned int
.
Il cout
probabilmente non ha funzionato a causa di conversione di tipo errato o non intenzionale. char*
è considerato una stringa terminata da null ed è facile confondere il codice di versione singed
e unsigned
. Se si passa ad unsinged char*
ostream::operator<<
come char*
tratterà e si aspettano il byte
ingresso come normali caratteri ASCII, dove 0
è destinata ad essere fine della stringa non un valore intero di 0
. Quando si desidera stampare i contenuti della memoria, è meglio lanciare esplicitamente dei puntatori.
Si noti inoltre che per stampare il contenuto della memoria di un buffer è necessario utilizzare un ciclo, poiché altrimenti la funzione di stampa non saprebbe quando fermarsi.
durante la conversione in un puntatore di caratteri, il primo byte è probabilmente zero, che è lo stesso del terminatore di stringa, quindi non verrà stampato nulla. Sarebbe di grande aiuto se potessi mostrare ciò che fai davvero, cioè pubblicare un po 'di codice. Si prega di creare un [SSCCE] (http://sscce.org/) e aggiungere alla domanda. –
Ma penso che perderebbero le informazioni se il primo byte è zero e in realtà sto provando a stampare tutti e quattro i byte ma non sta stampando nulla. –
La tua domanda sembra più sul "perché" piuttosto che sul "quando". Molto spesso, 'char unsigned * 'viene utilizzato come metodo di accesso a livello di byte per raggiungere in una variabile o indirizzo di memoria di un tipo altrimenti più formale. Ha molte sottigliezze, tra le quali, l'immunità alle rigide regole di aliasing e l'allineamento standard garantito con qualsiasi indirizzo tu ci passi. Nuovo in C++ non dovrebbe complicare questo compito se hai una certa familiarità con C. New to * programming *, vedo che questa è una sfida da comprendere. Forse hai qualche codice e un'idea dietro di esso hai domande? – WhozCraig