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

时间:2016-02-27 04:23:48

标签: 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 );

1 个答案:

答案 0 :(得分:4)

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

允许

char签名或签名,但是实现认为合适。如果char是无符号的,则从unsigned char减去128只会截断一半的位。如果char已签名,则无法保证其已经签署了两个补码,因此减去128将无法执行您想要的操作。

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

在这种情况下......只需投射指针:static_cast<char*>(arr.data())。无论如何,你都会引发未定义的行为;我宁愿以可能实际工作的方式去做;)

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

所以演员仍然是最有可能实际做你想要的选择。