2011-02-26 57 views
0

我試圖加密和與C++解密文件,使用此代碼:運行g ++應用程序時出錯。 (字符串加密)

#include <iostream> 

void crypt(char* pData, unsigned int lenData, const char* pKey, unsigned int lenKey) 
{ 
    for (unsigned int i = 0; i < lenData; i++) 
     pData[i] = pData[i]^pKey[i % lenKey]; 
} 

int main() 
{ 
    char* data = (char*)"any binary string here"; 
    crypt(data, 22, "key", 3); 
    std::cout << data; 
} 

我與g++ (tdm-1) 4.5.1(MinGW的)在Windows 6.1(七)編制,它沒有編譯錯誤或警告。當我嘗試運行時,它會顯示一個窗口,其中顯示「app.exe停止工作。如果有問題的解決方案,Windows可以在線檢查。」 (有些事情,我的Windows不是英文的)。我不知道什麼是錯的。

回答

1

此行是錯誤的:

char* data = (char*)"any binary string here"; 

首先,你不應該使用一個演員。接下來,字符串文字是一個常量。所以它應該是:

const char* data = "any binary string here"; 

但是你想覆蓋它。所以你需要一個不是常量的字符串。像這樣:

char data[] = "any binary string here"; 
3

你正試圖修改一個字符串常量。由於顯而易見的原因(它是常數),這是行不通的。相反,這樣做:

int main() 
{ 
    char data[] = "any binary string here"; 
    crypt(data, 22, "key", 3); 
    std::cout << data; 
} 
1

邁克已經很好地回答了這個問題。你不能修改常量字符串文字。 DOS的時間已經快結束了。適當的最新生產級別的C++編譯器應該已經發出了帶有適當標誌的警告。只是一點點添加到小李的答案,這裏是常量字符串字面量一個很好的解釋 - http://msdn.microsoft.com/en-us/library/69ze775t(v=vs.80).aspx

而且,這裏是更好的方式來做到這一點:

#include <iostream> 

void crypt(char* pData, unsigned int lenData, const char* pKey, unsigned int lenKey) 
{ 
    for (unsigned int i = 0; i < lenData; ++i) 
     pData[i] ^= pKey[i % lenKey]; 
} 

int main() 
{ 
    char data[] = "any binary string here"; 
    const char key[] = "key"; 
    crypt (data, sizeof(data) - 1, key, sizeof (key) - 1); 
    std::cout << data << std::endl; 
} 

注後遞增運算符, ^=和sizeof運營商。對於簡單的類型,編譯器會爲你做這種微型優化,但是養成良好的習慣是很好的。如果你有一個複雜的迭代器,使用後期增量可能會損害你的性能關鍵路徑。另外,字符串的硬編碼大小也容易出錯。稍後你或別人可以改變字符串,忘記改變它的長度。更不用說每次你必須去計算字符數量。

快樂編碼!