将数组从 unsigned char* 转换为 char*

Jav*_*ner 3 c++ char

需要将数组从 unsigned char* 安全地转换为 char*。我这样做。正确与否?

std::vector < unsigned char > arr;
char *imgData = (char*) malloc( arr.size() );
for ( int i = 0; i < arr.size(); i++ ) imgData[ i ] = ( arr.at( i ) - 128 );
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

不,那不安全。或者更重要的是,它不是 C++ 中定义明确的行为。

char允许有符号或无符号,但是实现认为合适。如果char是无符号的,从 中减去 128unsigned char只会截断一半的位。而如果char有符号,就不能保证它是有符号的二进制补码,所以减去 128 不会做你想要的。

您尝试进行的转换类型是不合理的。您将变量命名为imgData,因此您似乎打算将该数据发送到某个图像 API。并且该 API 需要常规char. 因此,您的目标似乎是将每个unsigned char转换为char共享与原始位模式完全相同的位模式unsigned char.

在那种情况下……只需投射指针:static_cast<char*>(arr.data())。无论哪种方式,您都会引发未定义的行为;我宁愿以可能实际有效的方式来做;)

另外,应该注意的是,C++14 实际上不可能实现char不使用二进制补码的签名版本。这是因为需要通过可能签名的char类型来支持 UTF-8 。您必须能够将 achar*转换为 anunsigned char*并返回,这样才能保留所有有效 UTF-8 代码单元的位模式。

所以演员表仍然是最有可能真正做你想做的事情的选择。