将“unsigned char *”转换为“char *”(和字符串)

时间:2016-04-17 10:03:12

标签: c++ visual-studio-2015

我正在与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等其他环境,我感激不尽。)。

1 个答案:

答案 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);
}

它甚至几乎不保证自己的功能。