2015-01-15 3 views
0

그래서 브라우저를 통해 소켓을 통해 JPEG를 보내고 싶습니다. 하지만 JPEG에서 읽는 데 계속 문제가 있습니다. 내 코드 :문자로 된 JPEG 읽기

FILE* fp = fopen(filename, "rb"); 
if(fp == NULL) 
    { 
     fp = fopen(FILE_404, "r"); 
    } else 
    { 

     struct stat fst; 
     stat(filename, &fst); 
     unsigned char *blob; 


     blob = (unsigned char *)malloc(fst.st_size); 

     fread(blob, 1, fst.st_size, fp); 

     header->content = (unsigned char*)malloc(fst.st_size); 

     strcat(header->content, blob); 
     header->content[fst.st_size+1] = "\0"; 
     header->content_len = fst.st_size; 

    } 

그러나 방울을 인쇄 할 때 모두 얻을 수는 다음과 같습니다 \377\330\377\340 파일이 있지만 : 67,165 바이트 큰. 어떻게해야합니까?

+0

는 어느 쪽도'header-> content' 블록도'blob'이 문자열 그래서 어떻게 사용할 수 없습니다 fread()을 통해에 성공적으로 읽은 후, blob의 내용을 인쇄하려면' strcat' 함수? – ouah

+0

당신은 완전히 맞습니다 (미안 해요, 몇 시간 동안이 물건을 개발 중입니다, 피곤합니다). 나는 그것을 고쳤지 만 문제는 더 일찍 일어난다. fread가 모든 것을 읽지 않는 것 같습니다. – yrk

+1

하나는 fread()의 반환 값을 확인하지 않은 것입니다. fread()는 반환 된 값을 알려줍니다. 또한 원시 이진 파일이기 때문에 정확히 "인쇄"하고 있습니까? printf()와 같은 문자열 함수는 사용할 수 없습니다. –

답변

1
  1. strcat(header->content, blob);은 이진 데이터에 적합하지 않습니다. strcat()은 문자열과 함께 작동합니다. @ouah

  2. 다음은 정의되지 않은 동작이며 content[fst.st_size+1]은 범위를 벗어납니다.

    reader->content = (unsigned char*)malloc(fst.st_size); 
    ... 
    header->content[fst.st_size+1] = ... 
    
  3. 코드 배열에 널 문자 '\0'를 추가 할 것으로 보인다. 문자열 "0"에 대한 포인터를 추가하는 것은 동일하지 않습니다. IAC, null 문자를 추가하는 것은 해결책이 아닙니다. blob의 데이터를 사용하기 전에 fread(blob, 1, fst.st_size, fp);

    header->content = (unsigned char*)malloc(fst.st_size); 
    .... 
    // bad code 
    header->content[fst.st_size+1] = "\0"; 
    
  4. 확인 반환 값. @Lee Daniel Crocker 또한 반환 값 stat()을 확인해야합니다.

  5. 미성년자 : 캐스팅하지 않아도됩니다. malloc() 반환합니다.

  6. // blob = (unsigned char *)malloc(fst.st_size); 
    blob = malloc(fst.st_size); 
    
  7. size_t i; 
    for (i = 0; i<fst.st_size; i++) { 
        printf(" %02X", blob(i)); 
    }