C++ 如何将无符号字符*的内容转换为常量字符*?

C++ 如何将无符号字符*的内容转换为常量字符*?,c++,casting,type-conversion,C++,Casting,Type Conversion,我可以跨越reinterpret cast,大多数时候,它被提出时,都会发出警告,所以我想知道是否还有其他替代方案(当然也可以是reinterpret cast的干净实现)你不会说发出了什么警告或者问题出在哪里,但是,使用reinterpret\u cast对char*进行强制转换时,应该不会出现警告: unsigned char *a; const char *b = reinterpret_cast<char*>(a); 无符号字符*a; const char*b=重新解释(a

我可以跨越reinterpret cast,大多数时候,它被提出时,都会发出警告,所以我想知道是否还有其他替代方案(当然也可以是reinterpret cast的干净实现)

你不会说发出了什么警告或者问题出在哪里,但是,使用
reinterpret\u cast
char*
进行强制转换时,应该不会出现警告:

unsigned char *a;
const char *b = reinterpret_cast<char*>(a);
无符号字符*a;
const char*b=重新解释(a);

您没有说明发出了什么警告或问题出在哪里,但是使用
重新解释强制转换
char*
应该可以在没有警告的情况下工作:

unsigned char *a;
const char *b = reinterpret_cast<char*>(a);
无符号字符*a;
const char*b=重新解释(a);

这取决于你想做什么

如果您只想以
char
的形式访问内容,那么
static\u cast
或在需要
char
的上下文中使用该值 我会成功的

如果需要将缓冲区传递给需要
字符常量*
的函数, 一个
reinterpret\u cast
是唯一的解决方案

如果您想要一个字符串,可以使用指针进入缓冲区:

std::string
bufferToString( unsigned char const* buffer, size_t length )
{
    return std::string( buffer, buffer + length );
}
也可以复制到现有字符串中:

myString.assign( buffer, buffer + length );
myString.append( buffer, buffer + length );
//  etc.
任何字符串函数(或算法,如
std::copy
)都需要两个 可以使用迭代器。所需的只是取消对 迭代器生成的类型隐式转换为
char
,即
无符号字符的情况

(不能使用带有缓冲区地址和 长度,因为这些不是模板,需要缓冲区地址 具有类型
字符常量*
。而
无符号字符
隐式转换 要转换
字符
无符号字符*
需要
重新解释\u cast

char*

这取决于您试图做什么

如果您只想以
char
的形式访问内容,那么
static\u cast
或在需要
char
的上下文中使用该值 我会成功的

如果需要将缓冲区传递给需要
字符常量*
的函数, 一个
reinterpret\u cast
是唯一的解决方案

如果您想要一个字符串,可以使用指针进入缓冲区:

std::string
bufferToString( unsigned char const* buffer, size_t length )
{
    return std::string( buffer, buffer + length );
}
也可以复制到现有字符串中:

myString.assign( buffer, buffer + length );
myString.append( buffer, buffer + length );
//  etc.
任何字符串函数(或算法,如
std::copy
)都需要两个 可以使用迭代器。所需的只是取消对 迭代器生成的类型隐式转换为
char
,即
无符号字符的情况

(不能使用带有缓冲区地址和 长度,因为这些不是模板,需要缓冲区地址 具有类型
字符常量*
。而
无符号字符
隐式转换 要转换
字符
无符号字符*
需要
重新解释\u cast

除非你想复制,否则在这里,
reinterpret\u cast
听起来像是正确的解决方案。要复制吗?内容怎么样?这就是我想要做的,除非我误解了你的问题。BTW,C++不允许转换没有<代码> RealTytCase<代码>的原因是,如果<代码> char < /C> >是2号的补码,那么对于负数<代码>((无符号CHAR)* RealTytCube(a))!a
:也就是说,将数据读取为
char
不同于将其读取为
无符号char
。但实际上这个规则是从C继承的,因为在C++中,非I2的补充存在一些问题,IIRC意思是:代码> char < /代码>需要是无符号的。无论如何,没有非二进制的补码C++实现,或者至少没有一个你会使用,所以注意到你可以忘记它…除非你想复制,<代码> RealTytCase< /Cord>这里听起来是正确的解决方案。要复制吗?内容怎么样?这就是我想要做的,除非我误解了你的问题。BTW,C++不允许转换没有<代码> RealTytCase<代码>的原因是,如果<代码> char < /C> >是2号的补码,那么对于负数<代码>((无符号CHAR)* RealTytCube(a))!a
:也就是说,将数据读取为
char
不同于将其读取为
无符号char
。但实际上这个规则是从C继承的,因为在C++中,非I2的补充存在一些问题,IIRC意思是:代码> char < /代码>需要是无符号的。无论如何,没有非二进制的补码C++实现,或者至少没有一个你会使用,所以注意到这一点你可以忘记它…