2011-12-08 59 views
0

我寫了一個非常簡單的加密程序來練習C++,我遇到了這個奇怪的行爲。當我通過設置字符串等於數組將字符*數組轉換爲字符串,然後我得到一個錯誤的字符串,但是當我創建一個空字符串並添加單獨數組中的字符時,它創建正確的字符串。有人可以解釋爲什麼發生這種情況,我剛剛開始編程在上週的c + +,我不明白爲什麼這不起作用。爲什麼我得到兩個不同的字符串?

順便說一句,我在網上查過,這些顯然都是有效的方式來將字符數組轉換爲字符串。

void expandPassword(string* pass) 
{ 
    int pHash = hashCode(pass); 
    int pLen = pass->size(); 
    char* expPass = new char[264]; 
    for (int i = 0; i < 264; i++) 
    { 
     expPass[i] = (*pass)[i % pLen] * (char) rand(); 
    } 
    string str; 
    for (int i = 0; i < 264; i++) 
    { 
     str += expPass[i];// This creates the string version correctly 
    } 

    string str2 = expPass;// This creates much shorter string 
    cout <<str<<"\n--------------\n"<<str2<<"\n---------------\n"; 

    delete[] expPass; 
} 

編輯:我刪除了所有從數組中的零和它並沒有改變任何東西

+11

您的編碼字符串包含零。 –

+0

「錯誤的字符串」是什麼意思?結果字符串與第一個字符串相同,除了結果字符串停在原始字符串中的第一個「\ 0」字符處「? –

回答

0

從char *複製到std :: string時,賦值操作符到達第一個NULL字符時停止。這指出了導致嵌入NULL字符的「加密」問題。

這是編碼與加密數據一起使用的主要原因之一。加密後,所得數據應使用Hex/base16或base64算法進行編碼。

+0

謝謝,我認爲其他人都說它只是忽略了0。這不是加密,而是密鑰的擴展,你是什麼意思,它被編碼? –

+0

編碼最好的地方是十六進制或base16編碼(http://en.wikipedia.org/wiki/Hexadecimal ) – jveazey

0

一個C字符串作爲你構建的是具有\ 0(零)結尾的一系列字符ascii值。

expPass[i] = (*pass)[i % pLen] * (char) rand(); 

你可以插入\ 0到數組如果表達式的計算結果爲0,以及不附加在所述串的端部的\ 0要麼保證的情況下

它是一個有效的C字符串。

當你做

string str2 = expPass; 

它可以很好地是字符串越短,因爲它被截斷時,它在字符串中找到\ 0地方。

0

這是因爲str2 = expPassexpPass解釋爲C風格字符串,這意味着零值(「null」)字節'\0'指示字符串的結尾。因此,舉例來說,這樣的:

char p[2]; 
p[0] = 'a'; 
p[1] = '\0'; 
std::string s = p; 

將導致s具有長度1,由於p有其終止'\0'之前僅一個非零字節。但這:

char p[2]; 
p[0] = 'a'; 
p[1] = '\0'; 
std::string s; 
s += p[0]; 
s += p[1]; 

會導致s有長度爲2,因爲它明確地增加了兩個字節來s。 (一種std::string,不像C風格的字符串,可以包含實際的空字節—雖然它並不總是要利用這個優勢是個好主意)

0

我猜以下行削減你的字符串:

expPass[i] = (*pass)[i % pLen] * (char) rand(); 

如果rand()返回0,你會在位置i得到一個字符串終止符。

相關問題