2016-04-17 264 views
1

我正在使用libsodium库处理pet项目,并发现将unsigned char *转换为char *比我想象的更简单。此外,我首先感到困惑,因为测试是在释放模式下传递的,稍后我意识到它们没有以调试模式传递。 于是我想出了以下内容:将“unsigned 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?)。

+4

不要混合'new'和'free()'。 –

+0

很有可能您的测试因为某些完全不同的原因而失败,并且您已实施的修复方案是解决方案,它掩盖了潜在问题,而不是修复它。 – dasblinkenlight

+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); 
} 

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

+0

我相信只要'std :: string(c,c + lc)'没有任何强制转换就行。如我错了请纠正我。使用那头野兽已经很长时间了。 :) –

+3

感谢您的例子!你只是忘了'c +';-)。这里:http://coliru.stacked-crooked.com/a/14f4c576def38129 –

+0

@ Cheersandhth.-Alf:太棒了! –