Zeichen ohne Vorzeichen wurden normalerweise zum Speichern von Zeichenfolgen im Unicode-Stil verwendet. Möchten Sie es wirklich direkt umwandeln, anstatt den Inhalt zu konvertieren?
@ jesses.co.tt Danke für die Ablehnung. Das Hauptmerkmal dieses Beitrags, das ihn auf den neuesten Stand bringt, ist seine Aktualität. Die anderen Antworten enthalten verschiedene Details und werden am besten separat gelesen und bewertet. Wenn die Antwort von @JaredPars das abdeckt, wonach Sie suchen, würde ich das verwenden und / oder es verbessern. Sie werden feststellen, dass ich die Zeit investiert habe, um auch das Format dieser zu verbessern. Ich sehe es wirklich nicht als sinnvoll an, diese Antwort auf den Inhalt der anderen auszudehnen.
Ruben Bartelink
3
ok, ich verstehe, dass Sie hier eine Begründung haben und als ganze Seite betrachtet, stimme ich zu, dass es nicht notwendig war, neu zu artikulieren ... Ich denke, es ist schwierig, sich die Zeit zu nehmen und stattdessen die gesamte Seite und die Zeitstempel zu betrachten Jede Antwort nach ihrem eigenen Verdienst beurteilen ... aber Punkt genommen (besonders von jemandem, der 55x mehr Ruf von mir hat!)
jesses.co.tt
22
Mir gefällt besonders, wie sehr Sie sich darum gekümmert haben, "FIRST!" dass du dich nicht einmal darum gekümmert hast basic formatting.
OJFord
7
Dies ist eine wirklich nutzlose "Antwort". Es liefert einfach keine Informationen.
OYRM
60
char *und const unsigned char *gelten als nicht verwandte Typen. Also willst du verwenden reinterpret_cast.
Wenn Sie jedoch const unsigned char*zu einem Nicht- constTyp wechseln möchten, müssen Sie diesen const_castzuerst verwenden. reinterpret_castkann keine constoder volatileQualifikation wegwerfen.
"Unrelated" ist hier irreführend: Es macht den Eindruck, dass man nicht von einem zum anderen werfen kann. Ich lese einen Entwurf von 2014, "3.9.1 Grundtypen", und er lautet: "A char, a signed charund a unsigned charbelegen dieselbe Speichermenge und haben dieselbe Ausrichtungsanforderung". Dies ist eine Beziehung. Oder hier ist ein besser lesbarer Link: en.cppreference.com/w/cpp/language/types#Character_types
unsigned char * ist im Grunde ein Byte-Array und sollte verwendet werden, um Rohdaten und nicht generell eine Zeichenfolge darzustellen. Eine Unicode-Zeichenfolge würde als wchar_t * dargestellt
Gemäß dem C ++ - Standard ist ein reinterpret_cast zwischen vorzeichenlosem char * und char * sicher, da sie dieselbe Größe haben und dieselbe Konstruktion und dieselben Einschränkungen haben. Ich versuche, reintrepret_cast noch mehr zu vermeiden als const_cast im Allgemeinen.
Wenn die statische Umwandlung mit Ihrer Arbeit fehlschlägt, sollten Sie Ihr Design überdenken, denn wenn Sie C ++ verwenden, möchten Sie möglicherweise die Vorteile des Plus-Plus-Teils nutzen und Zeichenfolgenklassen und STL (auch bekannt als std :: basic_string) verwenden könnte besser für Sie arbeiten)
Zu viele Kommentare zu unterschiedlichen Antworten, daher werde ich hier eine weitere Antwort hinterlassen.
Sie können und sollten reinterpret_cast<>in Ihrem Fall verwenden
str.append(reinterpret_cast<constchar*>(foo()));
Denn obwohl es sich bei diesen beiden Typen um verschiedene Typen handelt, 3.9.1 Fundamental types [basic.fundamental]heißt es im Standard von 2014, dass eine Beziehung zwischen ihnen besteht:
Plain char, signed charund unsigned chargibt drei verschiedene Arten, kollektiv schmalen Zeichentypen genannt. A char, a signed charund a unsigned charbelegen dieselbe Speichermenge und haben dieselben Ausrichtungsanforderungen (3.11); Das heißt, sie haben dieselbe Objektdarstellung.
Antworten:
reinterpret_cast
quelle
basic formatting
.char *
undconst unsigned char *
gelten als nicht verwandte Typen. Also willst du verwendenreinterpret_cast
.Wenn Sie jedoch
const unsigned char*
zu einem Nicht-const
Typ wechseln möchten, müssen Sie diesenconst_cast
zuerst verwenden.reinterpret_cast
kann keineconst
odervolatile
Qualifikation wegwerfen.quelle
char
, asigned char
und aunsigned char
belegen dieselbe Speichermenge und haben dieselbe Ausrichtungsanforderung". Dies ist eine Beziehung. Oder hier ist ein besser lesbarer Link: en.cppreference.com/w/cpp/language/types#Character_typesVersuchen
reinterpret_cast
unsigned char *foo(); std::string str; str.append(reinterpret_cast<const char*>(foo()));
quelle
unsigned char * ist im Grunde ein Byte-Array und sollte verwendet werden, um Rohdaten und nicht generell eine Zeichenfolge darzustellen. Eine Unicode-Zeichenfolge würde als wchar_t * dargestellt
Gemäß dem C ++ - Standard ist ein reinterpret_cast zwischen vorzeichenlosem char * und char * sicher, da sie dieselbe Größe haben und dieselbe Konstruktion und dieselben Einschränkungen haben. Ich versuche, reintrepret_cast noch mehr zu vermeiden als const_cast im Allgemeinen.
Wenn die statische Umwandlung mit Ihrer Arbeit fehlschlägt, sollten Sie Ihr Design überdenken, denn wenn Sie C ++ verwenden, möchten Sie möglicherweise die Vorteile des Plus-Plus-Teils nutzen und Zeichenfolgenklassen und STL (auch bekannt als std :: basic_string) verwenden könnte besser für Sie arbeiten)
quelle
Sie müssten a verwenden,
reinterpret_cast<>
da die beiden Typen, zwischen denen Sie werfen, keine Beziehung zueinander haben.quelle
Zu viele Kommentare zu unterschiedlichen Antworten, daher werde ich hier eine weitere Antwort hinterlassen.
Sie können und sollten
reinterpret_cast<>
in Ihrem Fall verwendenstr.append(reinterpret_cast<const char*>(foo()));
Denn obwohl es sich bei diesen beiden Typen um verschiedene Typen handelt,
3.9.1 Fundamental types [basic.fundamental]
heißt es im Standard von 2014, dass eine Beziehung zwischen ihnen besteht:(Auswahl ist meine)
Hier ist ein verfügbarer Link: https://en.cppreference.com/w/cpp/language/types#Character_types
Die Verwendung
wchar_t
für Unicode / Multibyte-Zeichenfolgen ist veraltet: Soll ich bei Verwendung von UTF-8 wchar_t verwenden?quelle
const unsigned attribName = getname(); const unsigned attribVal = getvalue(); const char *attrName=NULL, *attrVal=NULL; attrName = (const char*) attribName; attrVal = (const char*) attribVal;
quelle