2011-02-26 2 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; 
} 

나는 윈도우 6.1 (세븐)에 g++ (tdm-1) 4.5.1 (는 MinGW)로 컴파일하고있어, 그것은 아무와 함께 컴파일하지 오류 또는 경고. 내가 실행하려고하면 "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

마이크가이 질문에 잘 대답했습니다. 상수 문자열 리터럴은 수정할 수 없습니다. 도스의 시간은 거의 끝났다. 올바른 최신 생산 레벨 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; 
} 

주 후행 증가 연산자, ^= 및 크기 연산자. 간단한 유형의 컴파일러는이 미세 최적화를 수행하지만 좋은 습관을 개발하는 것이 좋습니다. 후행 증가를 사용하면 복잡한 반복자를 사용하는 경우 성능에 중요한 경로에 피해를 줄 수 있습니다. 또한 문자열의 크기를 하드 코딩하는 것은 오류가 발생하기 쉽습니다. 나중에 너 또는 다른 누군가가 문자열을 변경할 수 있으며 길이를 변경하는 것을 잊어 버릴 수 있습니다. 말할 필요도없이 매번 문자의 수를 계산해야합니다.

해피 코딩!

관련 문제