我正在使用libsodium库进行一个宠物项目,发现将未签名的char *转换为char *比我想象的要简单。我也首先感到困惑,因为测试是通过发布模式通过的,只是不久之后,我意识到它们没有通过调试模式通过。所以我想出了以下几点:
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等其他环境下工作),我将不胜感激。
您对此有过多的思考。
复制是多余的,额外的动态分配和空终止符的添加也是多余的(因为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);
}
它甚至不能保证发挥自己的作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句