2012-09-10 94 views
3

可能重複:
C++ style cast from unsigned char * to const char *無法從「無符號字符*」轉換成「字符*」

我有unsigned char* digest;這是一個程序的輸出,我想將它傳遞給char* S1;

I型char* S1=digest;並且不起作用

+2

類型是不同的這並不奇怪,它不起作用。問題是:你真的需要將'S1'聲明爲'char *'嗎?爲什麼不使用'unsigned char *'? –

+0

你見過http://stackoverflow.com/questions/658913/c-style-cast-from-unsigned-char-to-const-char? – wmorrison365

+0

其實我有一個函數,它需要作爲輸入參數char *和輸出無符號字符* ...我想再次輸入到函數的輸出再次,所以我需要的類型字符* ... – Hashed

回答

1

這是因爲unsigned charchar(在編譯器中確實是signed char)是不同的。你必須做一個明確的類型轉換:

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

它也會發生在'char'未簽名的實現上。三種字符類型*總是*三種不同的類型,並且在它們之間不存在任何隱式轉換,儘管在它們中的三種中僅保證兩種不同的表示。它會阻止你無意中編寫代碼,這取決於char是否已簽名,或者是否有符號整數具有表示形式 - 您只能通過強制轉換故意寫入該代碼。 –

+0

這個工作非常感謝 – Hashed

+1

我想強調的是,char,signed char和unsigned char實際上是三種不同的類型。 – sellibitze

1

字符類型是佈局兼容的,所以如果你知道你在做什麼,你可以簡單地強制指針與重新詮釋投:

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

的答案很簡單:你需要將其強制轉換:reinterpret_cast<unsigned char*>(digest)

然而,在這種情況下,你需要知道的是無符號的char *與char *是不是真的一樣的東西,除非陣列中的所有元素都小於128

字符*或者表示從-128到127(簽名)或0至255的值(無符號), 對方總是值從0到255

消化其本質的功能是有可能爲0和之間返回值255,包括在內。

此外,數組可能包含空字符(問題並未真正指定摘要來自何處),因此許多接受char *或unsigned char *的函數可能會失敗,因爲它們假定字符*是一個字符串(這是不是真的,如果是(大概)固定大小的二進制摘要)

0

空調風格轉換: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; 
} 
相關問題