2016-08-21 2 views
-1

De l'api wincrypt je reçois un * void pointant vers un char *. Ce caractère * pointe vers le début d'un caractère []. Je reçois également un void* pointant vers un int avec la taille du char*.convertir void * pointant en char * en une chaîne std :: en C++

En ce qui concerne pvData et cbData j'ai la documentation suivante de Microsoft.

Type de données de pvData: Un pointeur vers un tableau de valeurs BYTE. La taille de ce tableau est spécifiée dans le paramètre cbData. Renvoie une chaîne de caractères Unicode à terminaison nulle contenant le nom d'affichage du certificat.

Je veux convertir ce void* à un std::string mais jusqu'à présent, tout ce que je reçois lors de la sortie de mon std::string est le premier caractère.

J'ai lu: Converting a void* to a std::string mais depuis mon void* pointe vers un char* au lieu de la std::stringstatic_cast dans la réponse acceptée échoue et le retour std::string* déclenche une exception de pointeur NULL.

Jusqu'à présent, je donne les résultats suivants:

// pvData = void* pointing to char* 
// cbData = void* pointing to int* 
std::string tempName; 
tempName.assign(static_cast<char*>(pvData), static_cast<int*>(cbData)); 
printf("%S \n", pvData); // entire string is shown 
printf("%s \n", tempName.c_str()); // only first character is shown 

J'ai aussi essayé

tempName = static_cast<char*>(pvData); // only single character returned 

tempName.assign(static_cast<char*>(pvData)); // only single character returned 

char* arr = static_cast<char*>(pvData); 
std::string tempName(arr); // only single character returned empty with printf must 
// use std::cout 
+2

Vérifiez les arguments passés à 'std :: string :: assign'. – juanchopanza

+1

* "Ce char \ * est un char []" * Qu'est-ce que ça veut dire? –

+1

Et si vous lancez int * en int vous avez UB (ou une valeur inattendue, au mieux). C'est * cbData –

Répondre

5

Si le char buffer est non nul terminé, puis d'utiliser la longueur (void*)cbData:

char* data = static_cast<char*>(pvData); 
size_t len = *static_cast<int*>(cbData); 
std::string tempName(data, len); 

Voir le std::stringconstructor reference (# 5, from buffe r) et ::assign reference (n ° 4, tampon).

EDIT: Si vous essayez d'utiliser la fonction CertGetCertificateContextProperty avec dwPropIdCERT_FRIENDLY_NAME_PROP_ID, voici comment vous devez appeler la fonction:

CERT_CONTEXT ctx; 
BYTE buf[100]; 
DWORD len = 100; 
CertGetCertificateContextProperty(&ctx, CERT_FRIENDLY_NAME_PROP_ID, buf, &len); 
std::string tempName(reinterpret_cast<char*>(buf), len); 

Pas traitant void* pointeurs!

+0

Kind monsieur que vous avez gagné l'internet pour aujourd'hui, j'étais proche mais pas sigar. passer l'int directement à std :: string :: assign au lieu de faire size_t était la cause du problème! – Corne

+1

@Corne Je pense que le problème était que vous jetiez le 'void *' à un 'int' quand vous auriez dû le lancer dans un' int * '. – Galik

+0

@Galik non ce qui était une faute de frappe que j'ai enlevé pour éviter toute confusion, désolé à ce sujet ~! – Corne

2

La documentation indique spécifiquement qu'elle renvoie une chaîne Unicode, qui dans Microsoft-speak signifie UTF-16. Les caractères qui font partie de la plage ASCII contiendront un zéro dans leur second octet, ce qui met prématurément fin à une copie de chaîne. Vous obtiendrez de meilleurs résultats en utilisant wstring avec un cast à wchar_t*.

Si la copie en chaîne semble fonctionner, c'est parce que les octets zéro sont invisibles.

Mettre dans le contexte de votre code d'origine:

std::wstring tempName; 
tempName.assign(static_cast<wchar_t*>(pvData), (*static_cast<int*>(cbData))/sizeof(wchar_t)); 
printf("%S \n", tempName.c_str()); 

Notez que ce n'est pas la meilleure façon de le faire, vous devez également suivre les advice from qxz en ce qui concerne le constructeur de chaîne et le passage de cbData.

+0

J'ai aussi remarqué cela dans ma sortie parce qu'il y a un espace entre chaque personnage maintenant. Ceci explique pourquoi la copie pendant que size_t est spécifié le fait fonctionner. Je serai sûr de passer aux variables Unicode comme décrit. – Corne