将数组从无符号字符*转换为字符*

Convert array from unsigned char* to char*

本文关键字:字符 转换 无符号 数组      更新时间:2023-10-16

需要将数组从无符号字符*安全地转换为字符*。我这样做。正确与否?

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

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

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

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

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

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

因此,演员阵容仍然是最有可能真正做你想做的事的选项。