web-dev-qa-db-fra.com

Comment convertir un caractère non signé * en std :: string en C++?

J'ai unsigned char*, je veux le convertir en std::string. Pouvez-vous s'il vous plaît me dire le moyen le plus sûr de le faire?

33
Unicorn

Vous avez juste besoin de convertir le caractère non signé en caractère car la classe string n'a pas de constructeur acceptant le caractère non signé:

unsigned char* uc;
std::string s( reinterpret_cast< char const* >(uc) ) ;

Cependant, vous devrez utiliser l'argument length dans le constructeur si votre tableau d'octets contient des valeurs NULL, comme si vous ne partiez pas du tableau dans la chaîne (le tableau jusqu'au premier null)

size_t len;
unsigned char* uc;
std::string s( reinterpret_cast<char const*>(uc), len ) ;
53
Yacoby

BYTE* est probablement un typedef pour unsigned char*, mais je ne peux pas le dire avec certitude. Cela aiderait si vous nous disiez ce que BYTE est.

Si BYTE * est unsigned char *, vous pouvez le convertir en std :: string à l'aide du constructeur de plage std :: string, qui prendra deux itérateurs génériques.

const BYTE* str1 = reinterpret_cast<const BYTE*> ("Hello World");
int len = strlen(reinterpret_cast<const char*>(str1));
std::string str2(str1, str1 + len);

Cela étant dit, êtes-vous sûr que c'est une bonne idée? Si BYTE est unsigned char, il peut contenir des caractères non-ASCII, pouvant inclure des valeurs NULL. Ceci fera que strlen donnera une longueur incorrecte.

6
Charles Salvia
BYTE *str1 = "Hello World";
std::string str2((char *)str1);  /* construct on the stack */

Alternativement:

std::string *str3 = new std::string((char *)str1); /* construct on the heap */
cout << &str3;
delete str3;
3
spoulson

BYTE n'est rien d'autre que typedef unsigned char BYTE;

Vous pouvez facilement utiliser l'un des constructeurs ci-dessous

string ( const char * s, size_t n );
string ( const char * s );
2
Satbir

Si a accès à CryptoPP

Chaîne hexadécimale lisible en caractère non signé

std::string& hexed = "C23412341324AB";
uint8_t      buffer[64] = {0};
StringSource ssk(hexed, true,
            new HexDecoder(new ArraySink(buffer,sizeof(buffer))));

Et retour

std::string hexed;
uint8_t val[32]  = {0};
StringSource ss(val, sizeof(val), true,new HexEncoder(new StringSink(hexed));
// val == buffer
0
user2195463