将void*指向char*转换为c ++中的std :: string

0 c++ string void-pointers

从wincrypt api我收到一个指向char*的void*.这个char*指向char []的开头.我也收到一个void*指向一个大小为int的int char*.

关于pvData和cbData,我有以下来自Microsoft的文档.

pvData的数据类型:指向BYTE值数组的指针.此数组的大小在cbData参数中指定.返回以null结尾的Unicode字符串,其中包含证书的显示名称.

我希望将其转换void*为a,std::string但到目前为止,我输出的std::string是第一个字符.

我已阅读:转换一个void*到一个std ::字符串,但因为我void*是指向char*而不是std::stringstatic_cast中公认的答案失败,返回std::string*触发空指针异常.

到目前为止,我有以下内容:

// 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
Run Code Online (Sandbox Code Playgroud)

我也试过了

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
Run Code Online (Sandbox Code Playgroud)

qxz*_*qxz 5

如果char缓冲区不以null结尾,则使用(void*)cbData长度:

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

请参阅std::string 构造函数引用(#5,来自缓冲区)和::assign引用(#4,缓冲区).

编辑:如果你想使用的功能则CertGetCertificateContextPropertydwPropId CERT_FRIENDLY_NAME_PROP_ID,这里是你应该如何调用该函数:

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);
Run Code Online (Sandbox Code Playgroud)

没有处理void*指针!