无法将“unsigned char*”转换为“char*”

5

2
类型不同,所以它不能正常工作并不奇怪。问题是:你真的需要将 S1 声明为 char* 吗?为什么不使用 unsigned char* - Konrad Rudolph
你看过这个问题吗?https://dev59.com/JnRB5IYBdhLWcg3wUV1d - wmorrison365
实际上,我有一个函数,它以char作为输入参数,并输出unsigned char... 我想重新将输出输入到函数中,因此需要将其转换为char*类型... - Hashed
你的 unsigned char * digest 中间某个位置是 '\0' 或者 0。这就是为什么当 reinterpret_cast<char *>(digest) (char *)digest 时,C-String 从 0 位置截断到中间位置的原因。 - Joma
4个回答

10
简单回答:您需要进行强制类型转换:reinterpret_cast<unsigned char*>(digest) 然而,在这种情况下,您需要知道除非数组中的所有元素都小于128,否则unsigned char*和char*并不真正相同。
char*可以表示从-128到127(带符号)或0到255(无符号)之间的值,而另一个则始终表示0到255之间的值。
由其性质可知,摘要函数可能会在结果中返回介于0和255之间的值。
此外,数组很可能包含空字符(问题并没有真正指定摘要来自何处),因此许多接受char*或unsigned char*的函数可能会失败,因为它们假定char*是一个字符串(如果它是固定大小的二进制摘要,则实际上并不是)。

2

这是因为unsigned charchar(在您的编译器中实际上是signed char)是不同的。您需要进行显式类型转换:

char* S1 = reinterpret_cast<char*>(digest);

2
如果在实现中char是无符号的,这种情况也会发生。三种字符类型始终是*三种不同的类型,并且它们之间永远没有指针之间的隐式转换,尽管在它们三个之间保证只有两种不同的表示方式。这是为了防止您意外编写依赖于char是否带符号或带符号整数具有什么表示的代码--您只能通过强制转换来有意地编写该代码。 - Steve Jessop
1
我想强调的是,char、signed char和unsigned char实际上是三种不同的数据类型。 - sellibitze

1

字符类型是布局兼容的,因此如果您知道自己在做什么,可以使用重新解释的强制转换来简单地强制指针:

char * s1 = reinterpret_cast<char *>(digest);

0

C风格转换:s1=(char *)digest;

C++风格转换:s1=reinterpret_cast<char *>(digest);

#include <iostream>
using namespace std ;



int main(void)
{

    unsigned char* digest;
    char * s1c,*s1cpp; 


    //C style cast
    s1c=(  char *)digest;


    //C++ style cast
    s1cpp= reinterpret_cast<char *>(digest);




  cout<<" \nPress any key to continue\n";
  cin.ignore();
  cin.get();

   return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接