szukam metody na konwersje z unsigned char na char i z powrotem
static_cast<typ na który chcesz rzucić>(zmienna)
unsigned char c;
auto c2{static_cast<char>(c)};
Eldorad O. napisał(a):
unsigned char c; auto c2{static_cast<char>(c)};
ja niełąpie w czym rzecz z tymi funkcjami
wilkwielki napisał(a):
Eldorad O. napisał(a):
unsigned char c; auto c2{static_cast<char>(c)};
ja niełąpie w czym rzecz z tymi funkcjami
juz mam znalazłem https://cpp0x.pl/kursy/Kurs-C++/Poziom-5/Kontenery-asocjacyjne-std-set-i-std-map/589 ale nie ma char
wilkwielki napisał(a):
juz mam znalazłem https://cpp0x.pl/kursy/Kurs-C++/Poziom-5/Kontenery-asocjacyjne-std-set-i-std-map/589 ale nie ma char
To jest zupełnie co innego. Jeśli kompletnie nie wiesz, co robisz, to niestety musisz wrócić do kursu C++ i nadrobić zaległości.
@wilkwielki: Poczytaj sobie o rzutowaniu:
https://www.learncpp.com/cpp-tutorial/explicit-type-conversion-casting-and-static-cast/
Pytanie jest niepełne nie wiadomo w czym jest problem.
Konwersja między char
i unsigned char
następuje domyślnie. Nie trzeba nic robić. Wystarczy proste przypisane.
Ciekawsza jest mała pułapka przy konwersji typów całkowitych. Takie coś nie działa zgodnie z oczekiwaniem:
char ch = '\xa1'
auto x = static_cast<unsigned int>(ch);
assert(x == 0xa1);
bo zrobi char -> int -> unsigned int
.
https://godbolt.org/z/96d5vj3f7
wszystko zależy od oczekiwań :) i kompilatora np. https://learn.microsoft.com/en-us/cpp/build/reference/j-default-char-type-is-unsigned?view=msvc-170
Czym jest dla ciebie konwersja między unsigned a signed char? Typ unsigned char ma zakres 0~255, a signed char -128~+127. Więc jeśli chodzi o część wspólną tych zakresów, czyli wartości od 0 do 127, to w C wystarczy zwykłe przypisanie. W przypadku innych wartości musisz się zastanowić o co Ci dokładnie chodzi, ponieważ nie możesz zapisać wartości poniżej 0 za pomocą typu bez znaku, ani wartości powyżej 127 za pomocą typu signed char. I teraz jeśli celem jest odwzorowanie bitów, to też wystarczy przypisanie - testowane. Ale jakbyś np. chciał konwertować wartości spoza zakresu z tzw. nasyceniem, oto kod.
#include <limits.h>
unsigned char uc;
signed char sc;
/* ... */
if (uc <= SCHAR_MAX)
sc = uc;
else
sc = SCHAR_MAX;
/* ... */
unsigned char qta = 240;
char cz = (char)qta;
@MarekR22: że Ci sie dalej chce tutaj odpowiadać, to jestem pełen podziwu xd
MexikanoS napisał(a):
unsigned char qta = 240; char cz = (char)qta;
@MarekR22: że Ci sie dalej chce tutaj odpowiadać, to jestem pełen podziwu xd
a jak zmierzyć długość stringa tzn unsigned char bo metoda strlen jest taki błąd C:\projekty\charnauchar\charnauchar.cpp(16) : error C2664: 'strlen' : cannot convert parameter 1 from 'unsigned char *' to 'const char *'
To trzeba było od razu o to pytać… Szczególnie, że unsigned char
to coś zupełnie innego niż unsigned char *
.
A co do samego pytania — najpierw warto się zastanowić, czy na pewno nie robisz niczego dziwnego i w ogóle potrzebujesz tak cudować, a jeśli faktycznie tak, to reinterpret_cast
Ci pomoże. A jeśli piszesz w C, nie w C++ (bo w sumie nie napisałeś, w czym piszesz, a z jakiegoś powodu się męczysz z C-stringami…), to tam jest tylko jeden sposób castowania: (typ) zmienna
.
Althorion napisał(a):
To trzeba było od razu o to pytać… Szczególnie, że
unsigned char
to coś zupełnie innego niżunsigned char *
.A co do samego pytania — najpierw warto się zastanowić, czy na pewno nie robisz niczego dziwnego i w ogóle potrzebujesz tak cudować, a jeśli faktycznie tak, to
reinterpret_cast
Ci pomoże. A jeśli piszesz w C, nie w C++ (bo w sumie nie napisałeś, w czym piszesz, a z jakiegoś powodu się męczysz z C-stringami…), to tam jest tylko jeden sposób castowania:(typ) zmienna
.
już mam
unsigned char *v;
int l = strlen((char*)v);
To jest typowy problem XY.
Niby znalazłeś odpowiedź, ale to nadal nie wydaje się tym z czym naprawdę się mierzysz.