我正在与libsodium库一起开展宠物项目,并发现将unsigned char *转换为char *比我想象的要简单。另外我第一次感到困惑,因为测试是在Release模式下传递的,稍后我意识到他们没有在调试模式下传递。 所以我想出了以下内容:
std::string string_from_uchar(const unsigned char * c, unsigned long long lc)
{
unsigned char * cc = new unsigned char[lc+1] ;
std::strncpy((char *) cc, (char *) c, lc);
cc[lc] = 0;
char* cr = reinterpret_cast<char *> (cc);
std::string ret(cr);
delete[](cr);
return ret;
}
虽然它现在通过了测试,但如果有人能够检查它是否是正确的方法(例如,它是否适用于gcc或clang等其他环境,我感激不尽。)。
答案 0 :(得分:5)
你大肆过度思考这个问题。
副本是冗余的,因为额外的动态分配和添加空终止符(因为std::string
有一个构造函数,只接受这种情况下的长度参数)。
各种char
可以别名,所以简单:
std::string string_from_uchar(const unsigned char * c, unsigned long long lc)
{
return std::string((const char*)c, lc);
}
事实上,如果你使用一个范围的构造函数,你甚至不需要演员:
std::string string_from_uchar(const unsigned char * c, unsigned long long lc)
{
return std::string(c, c + lc);
}
它甚至几乎不保证自己的功能。