【问题标题】:cannot convert from 'unsigned char *' to 'char *' [duplicate]无法从 'unsigned char *' 转换为 'char *' [重复]
【发布时间】:2012-09-03 07:28:53
【问题描述】:

可能重复:
C++ style cast from unsigned char * to const char *

我有unsigned char* digest;,它是程序的输出,我想将它传递给char* S1;

我输入 char* S1=digest; 并不起作用

【问题讨论】:

  • 类型不同所以它不起作用也就不足为奇了。问题是:你真的需要将S1 声明为char* 吗?为什么不使用unsigned char*
  • 实际上我有一个函数,它以 char* 作为输入参数并输出 unsigned char*... 我想再次将输出重新输入到函数中,所以我需要是 char* 类型...
  • unsigned char * digest 中的某个中间位置是 '\0'0 。这就是为什么reinterpret_cast<char *>(digest)(char *)digest时的C-String从0位置到中间位置被截断的原因。

标签: c++ char unsigned


【解决方案1】:

这是因为unsigned charchar(在你的编译器中实际上是signed char)是不同的。您必须进行明确的类型转换:

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

【讨论】:

  • 它也会发生在char 未签名的实现上。这三种 char 类型总是三种不同的类型,并且在指向它们的指针之间永远不会有隐式转换,即使在这三种类型中只能保证两种不同的表示形式。这是为了防止您意外编写取决于char 是否有符号或有符号整数的表示形式的代码——您只能通过强制转换故意编写该代码。
  • 我想强调一下,char、signed char 和 unsigned char 实际上是三种不同的类型。
【解决方案2】:

Char 类型与布局兼容,因此如果您知道自己在做什么,您可以简单地通过重新解释强制转换来强制指针:

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

【讨论】:

    【解决方案3】:

    简单的答案:你需要转换它:reinterpret_cast&lt;unsigned char*&gt;(digest)

    但是,在这种情况下,您需要注意 unsigned char* 和 char* 并不是一回事,除非数组中的所有元素都小于 128。

    char * 表示从 -128 到 127(有符号)或 0 到 255(无符号)的值, 其他的值总是从 0 到 255。

    按其性质,摘要函数可能会在结果中返回介于 0 和 255 之间的值。

    此外,数组很可能包含空字符(问题并未真正指定摘要的来源)这一事实,许多接受 char * 或 unsigned char* 的函数可能会失败,因为它们假定 char * 是一个字符串(如果它是(可能)固定大小的二进制摘要,则实际上不是)

    【讨论】:

      【解决方案4】:

      C 风格演员表:s1=( char *)digest;

      C++ 风格转换:s1= reinterpret_cast&lt;char *&gt;(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;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-10-19
        • 2018-08-22
        • 1970-01-01
        • 2012-04-28
        • 2013-02-09
        • 2011-10-19
        • 2013-09-23
        • 1970-01-01
        • 2023-04-01
        相关资源
        最近更新 更多