将数组从无符号字符*转换为字符*
Convert array from unsigned char* to 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 );
不,这不安全。或者更重要的是,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 代码单元的位模式。
因此,演员阵容仍然是最有可能真正做你想做的事的选项。
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 字符转换功能 std::isupper() & std::islower() C++17
- 将字符 * 转换为字符串 *
- 在编译时将常量字符* 转换为常量 char_type*
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 无法使用字符串流将字符转换为字符串C++
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法<string>从"常量字符 []"转换为<类名>
- 不能将字符转换为整数吗?
- 编译时将字符*转换为字节
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 将单个字符转换为 std::string 前缀 \x01
- PPM 将字符转换为 int 授予负数
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 将常量字符* 转换为字符时出错