Typ unsinged char
jest zwykle używany jako reprezentacja pojedynczego byte
danych binarnych. Zatem i tablica jest często używana jako binarny bufor danych, gdzie każdy element jest pojedynczym bajtem.
Konstrukcja unsigned char*
będzie wskaźnikiem do bufora danych binarnych (lub jego pierwszego elementu).
Nie jestem w 100% pewny, co standard c++
mówi dokładnie o rozmiarze unsigned char
, niezależnie od tego, czy jest ustawiony na 8-bitowy, czy nie. Zazwyczaj jest to. Postaram się go znaleźć i opublikować.
Po obejrzeniu kodu
Podczas korzystania coś podobnego void* input
jako parametr funkcji, celowo rozebrać informacji o wejściach typu oryginału. Jest to bardzo silna sugestia, że dane wejściowe będą traktowane w sposób bardzo ogólny. To znaczy. jako dowolny ciąg bajtów. int* input
z drugiej strony sugerowałaby, że będzie traktowana jako "ciąg" pojedynczych liczb całkowitych.
void*
jest stosowany głównie w przypadkach, gdy wejście zostanie zakodowany, lub traktowane bit
/byte
mądry z jakiegokolwiek powodu, ponieważ nie można wyciągnąć wnioski na temat jego zawartości.
Następnie w swojej funkcji wydaje się, że chcesz traktować wejście jako ciąg bajtów. Ale do działania na obiektach, np. wykonując operator=
(zadanie) kompilator musi wiedzieć, co robić. Ponieważ deklarujesz dane wejściowe jako void*
, takie przypisanie, jak *input = something
, nie ma sensu, ponieważ *input
ma typ void
. Aby kompilator traktował elementy input
jako "najmniejsze fragmenty nieprzetworzonej pamięci", należy go przesłać do odpowiedniego typu, który jest unsigned int
.
Prawdopodobnie nie zadziałało cout
z powodu niewłaściwej lub niezamierzonej konwersji typu. char*
jest uważany za zakończony znakiem zero i łatwo jest pomylić kod wersji singed
i unsigned
. Jeśli podasz unsinged char*
do jako char*
będzie traktować i oczekiwać, że wejście byte
jako normalne znaki ASCII, gdzie 0
ma być koniec ciąg nie liczba całkowita wartość 0
. Gdy chcesz wydrukować zawartość pamięci, najlepiej rzucić okiem na wskaźniki.
Należy również pamiętać, że aby wydrukować zawartość pamięci bufora, należy użyć pętli, ponieważ inna funkcja drukowania nie wiedziałaby, kiedy zatrzymać.
podczas konwersji do wskaźnika postaci, pierwszy bajt ma prawdopodobnie wartość zero, która jest taka sama jak terminator łańcucha, a więc nic nie zostanie wydrukowane. Pomogłoby to więcej, gdybyś mógł pokazać to, co naprawdę robisz, tj. Opublikować kod. Proszę zrób [SSCCE] (http://sscce.org/) i dodaj do pytania. –
Ale myślę, że to utraciłoby informację, jeśli pierwszy bajt wynosi zero i faktycznie próbuję wydrukować wszystkie cztery bajty, ale to nie drukuje niczego. –
Twoje pytanie dotyczy raczej "dlaczego", a nie "kiedy". Bardzo często "unsigned char *" jest używane jako metoda dostępu na poziomie bajta do osiągnięcia zmiennej lub adresu pamięci innego, bardziej formalnego typu. Ma wiele cech, między innymi odporność na rygorystyczne zasady aliasingu i gwarantowane w standardzie wyrównanie z jakimkolwiek adresem, który na nie rzucasz. Nowość w C++ nie powinna sprawić, że będzie to trudne, jeśli dobrze znasz C. Nowość w programowaniu *, postrzegam to jako wyzwanie do zrozumienia. Być może masz jakiś kod i pomysł, za którym masz pytania? – WhozCraig