从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::string在static_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)
如果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,缓冲区).
编辑:如果你想使用的功能则CertGetCertificateContextProperty用dwPropId 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*指针!
| 归档时间: |
|
| 查看次数: |
2272 次 |
| 最近记录: |