2010-08-12 4 views
1

음악 파일의 10000 바이트를 암호화하고 암호를 해독하려고합니다. 나는 코드를 사용했다 :XOR을 사용하여 음악 파일을 암호화하는 방법

if(file!=NULL && g!= NULL) 
{ 
    while(!feof(file)) 
    { 
     count++; 
     char aByte; 
     fread(&aByte, sizeof(char), 1, file); 
     if (count <= 10000) 
     { 
      if (count % 2 == 0) 
      { 
       if ((aByte^'A') != EOF) aByte = aByte^'A'; 
      } 
      else 
      { 
       if ((aByte^'B') != EOF) aByte = aByte^'B'; 
      } 
     } 
     fwrite(&aByte, sizeof(char), 1, g); 
    } 
} 
fclose(file); 

그러나 코드는 작동하지 않는다. 도와주세요!!!

+0

"작동하지 않음"이란 무엇입니까? – kennytm

+0

실행 후 2 회 암호화하십시오. 파일을 실행할 수 없습니다 (수신 대기 중). – user418304

답변

1

"암호화"를 제거하여 파일 처리를 테스트하십시오. 이 줄을 꺼내십시오.

 if (count % 2 == 0) 
     { 
      if ((aByte^'A') != EOF) aByte = aByte^'A'; 
     } 
     else 
     { 
      if ((aByte^'B') != EOF) aByte = aByte^'B'; 
     } 

파일이 완전히 똑같습니까? 나는 그것이되지 않을 것이라고 생각한다. 마지막에 당신이 파일을 닫을, 그래서 그 바이트 파일 미만 10,000 바이트

  • 을 상실한다고 가정 - - 당신이하지 않는 몇 가지 이유가

    1. 파일이 이상 10,000 바이트보다 있습니다 추가 바이트가 쓰여지는 것처럼 보이도록 EOF 속성을 확인하십시오.
    2. 이 코드에서는 카운트가 초기화되지 않습니다. 한 번 실행해도 홀수이고 다른 경우에도 홀수이면 일치하지 않습니다. 또한, 그것은 단지 카운트가 무엇인지에 따라 임의의 수의 바이트를 복사 할 것입니다. 아마도 그것은 다른 곳에서 초기화되었을 것입니다. 이 특별한이다, EOF는 파일에서 찾을 수있는 바이트되지 않습니다 :
    3. 당신은 닫지 g을, 그래서 당신이 플러싱 확신 할 수 없다

    업데이트 (버퍼 수에 fwrite 글) 일부 FILE API 함수 (fread가 아님)가 사용하는 리턴 값.

    getchar가 함수()는 다음과 같이 정의된다 :이

    int getchar(); 
    

    그것은 EOF 또는 문자의 범위 int를 반환하거나. 파일이 EOF이면 파일의 끝에 있다는 의미입니다. 그렇지 않은 경우 안전하게 반환 할 수 있습니다. EOF에 대한 유일한 규정은 유효한 문자가 아니라는 것입니다. getchar()은 char로 표현할 수없는 총 257 개의 선택 항목에 대해 char (256 개 선택 사항) + EOF를 리턴 할 수 있기 때문에 int를 리턴합니다.

    fread()를 보면 char과 아무 관계가 없음을 알 수 있습니다. 버퍼와 레코드 크기, 레코드 수를 취하고 읽은 바이트 수를 반환합니다. 당신은 sizeof (char)와 char를 얻기 위해 1로 전달됩니다. EOF가 유효한 char가 아니기 때문에 char에 EOF를 저장할 수 없습니다. int이며 적합하지 않습니다. getchar()과 같은 규칙을 사용하지 않습니다. EOF를 만나면 요청 된 Y이트 수보다 적은 수를 리턴합니다. fread()가 0을 반환하면 feof()와 ferror()를 검사하여 파일의 끝이나 오류가 발생했는지 확인합니다 (둘 다 fread가 요청한 수보다 작은 수를 반환하도록합니다).).

  • 2

    당신은 (그런데, fread 오히려 값이 당신의 버퍼에 기록보다 반환 값에 표시) EOF를 확인하고있는 XOR을하지 말아야; 파일에 쓸 바이트를 준비 할 때만.

    또한 올바르게 암호화하려면 더 긴 키가 필요합니다. — 키를 해독 할 수없는 사람에게는 키를 알 수 있어야합니다.

    +0

    Sr. 이해가 안됩니다. 하지만 파일에 EOF를 쓰고 싶지 않기 때문에 EOF를 확인합니다. 바이트 xor 키를 결과 EOF 내가 파일에 바이트를 작성합니다. – user418304

    +0

    필자는'feof()'호출을 제거하고 대신 호출 할 때마다'fread'의 반환 값을 검사 할 것입니다. 0을 반환하면 더 이상 데이터가 없으므로 루프에서 벗어납니다. – David

    +0

    while (! feof (file)). SR이 검사만으로 충분하지 않습니까? – user418304

    관련 문제