2013-07-25 111 views
0
#include <stdio.h> 
#include <string.h> 
#include <openssl/sha.h> 

int main() 
{ 
    unsigned char ibuf[] = "trysha"; 
    unsigned char obuf[20]; 

    SHA1(ibuf, strlen(ibuf), obuf); 

    int i; 
    for (i = 0; i < 20; i++) { 
     printf("%02x ", obuf[i]); 
    } 
    printf("\n"); 

    return 0; 
} 

我得到了一些錯誤與此代碼..C代碼轉換爲C++ SHA1問題

sha.cpp: In function ‘int main()’: 
sha.cpp:10:27: error: invalid conversion from ‘unsigned char*’ to ‘const char*’ [-fpermissive] 
/usr/include/string.h:399:15: error: initializing argument 1 of ‘size_t strlen(const char*)’ [-fpermissive] 
+0

只需使用'static_cast '將它們轉換爲正確的類型即可。 – trojanfoe

+0

如果你已經知道你的字符串有多長,'strlen'只是愚蠢的。只需使用'sizeof ibuf'。 –

回答

1

strlen()想要一個const char *,或至少char*,問題是,你給它一個unsigned char*。你應該這樣做:

#include <stdio.h> 
#include <string.h> 
#include <openssl/sha.h> 

int main() 
{ 
    char ibuf[] = "trysha"; 
    unsigned char obuf[20]; 

    SHA1(ibuf, strlen(ibuf), obuf); 

    int i; 
    for (i = 0; i < 20; i++) { 
     printf("%02x ", obuf[i]); 
    } 
    printf("\n"); 

    return 0; 
} 

如果SHA1期待一個unsigned char*作爲第一個參數,你可能要投ibufSHA1(static_cast<unsigned char*>(ibuf), strlen(ibuf), obuf);

通過你不需要strlen()的方式,你可以通過這個替換它: SHA1(ibuf, sizeof(ibuf), obuf);

0

它會告訴你什麼是錯的 - strlen不接受unsigned char*,而是普通的const char*。根據C++ 98標準的3.9.1.1,signed char,unsigned charchar是不同的類型,你不能明確地轉換它們。

爲什麼你使用unsigned char作爲C風格的字符串呢?