2010-05-18 3 views
1

텍스트 문서 (.html, .txt 등)를 다운로드 할 수 있지만 이미지 또는 exe 파일을 다운로드 할 수 없습니다. 나는 이것이 char을 사용하고 있고 그 파일들이 바이너리이기 때문에 이것이 확실하다고 확신한다. C#에서는 바이트를 사용한다는 것을 알고 있습니다. 그러나이 경우 어떤 데이터 유형을 사용해야합니까?C에서 다운로드를 손상시키는 InternetReadFile()

char buffer[1]; 
    DWORD dwRead; 
    FILE * pFile; 
    pFile = fopen(file,"w"); 
    while (InternetReadFile(hRequest, buffer, 1, &dwRead)) 
    { 
     if(dwRead != 1) break; 
     fprintf(pFile,"%s",buffer); 
    } 
    fclose(pFile); 
+0

1 바이트보다 큰 버퍼를 사용하는 것이 훨씬 효율적입니다. –

답변

4

문제가 char가 아니며 % s와 (과) fprintf를 사용 중입니다. char은 모든 바이트 값을 보유 할 수 있습니다. 바이너리 데이터 청크에 \0 (NULL) 문자가 있으면 fprintf는 그 시간에 데이터 출력을 중지합니다.

이 경우 fwrite을 사용하려고합니다.

Windows에서 이진 파일을 열 때 b 지정자를 사용하는 것도 중요합니다.

+2

네가 맞아. 내 대답을 삭제했습니다. 나는 OP가 또한'w' 대신에'wb'와 함께'fopen() '을 사용할 필요가 있다고 생각합니다. 그렇지 않으면 Windows 컴파일러가 이진 파일들을 쓸 때 유용하게 번역하고 손상시킬 것입니다. –

+0

내가 필요한 것. – Lienau

2

크기가 1이므로 널 (null)로 끝나지 않은 버퍼로 한 번에 한 바이트를 읽으므로 형식 문자열로 '%c'또는 putc(buffer[0], pFile)을 사용하여 한 번에 한 바이트 씩 출력해야합니다 . 그것이 그대로 버퍼 오버 플로우에 취약합니다 (나쁜 일이 일어날 수 있습니다!).

Windows 플랫폼을 사용하는 경우 이진 모드로 파일을 여는 것이 좋습니다. 바이너리와 텍스트 모드 사이에 차이가 없기 때문에 유닉스에는 아무런 해가 없다.

관련 문제