2014-10-23 2 views
-2

는 내가 전달하고자하는 내가 문자열로 c_string를 변환하는 경우 그 최종 결과에 영향을 미칠 것인지, 기본적으로 내가 궁금해서 바이너리 파일이 c_string 다시 문자열로 c_string를 변환 할 때 read()를 사용한 후에 c_string을 보내서 텍스트 파일이 아닌 이진 파일을 읽었는지 확인한 다음 문자열에 넣고 c_string으로 다시 변환했습니다. 그것이 좋지 않다면 바이너리 형식으로 되돌릴 수있는 간단한 방법이 있습니까?데이터 표현 손실 때문에,

FILE *file = fopen(filename, "ab"); 


    int size = 0; 

    do{ 

     size = recvfrom(s, buffer, 128, 0, (LPSOCKADDR) &sa_in, &senderSize); 

     if(size > 0) 
     { 


      fwrite(buffer, sizeof(char), size, file); 


     } 
    }while(size > 0); 

c_string (이진)은 문자열로 바뀌고 c_string으로 되돌아갑니다. 이렇게

  FILE *file = fopen(filename, "ab"); 


      int size = 0; 

      do{ 

       size = recvfrom(s, buffer, 128, 0, (LPSOCKADDR) &sa_in, &senderSize); 

       if(size > 0) 
       { 
        string bufferstring(buffer); 
        strcpy(buffer, bufferstring); 


        fwrite(buffer, sizeof(char), size, file); 


       } 
      }while(size > 0); 

답변

2

:

string bufferstring(buffer); 

입력으로 널 종료 문자열을 사용하는 것을 의미한다. buffer의 데이터는 정확히 길이가 127 인 널 종료 문자열이 아닐 수 있습니다. 길이가 짧으면 데이터가 손실되고 버퍼에 널 (NULL) 터미네이터가없는 경우 정의되지 않은 동작이 발생합니다.

다음 줄, strcpy(buffer, bufferstring);도 컴파일되지 않습니다; std::stringstrcpy의 인수로 사용할 수 없습니다.

은 그 후 당신은 정의되지 않은 buffera로부터 물품. 당신이 그것을 변경할 수 있습니다 코드의 첫 번째 버전의 몇 가지 문제는

이 되었습니까?

+0

문자열은 c_strings보다 1 바이트 커야합니까? – IceKing

+0

아니요, C 문자열에 Null 종결자가 있습니다. 요점은 파일에서 읽는 데이터가 null이 아닌 127 바이트가 아닌 null 바이트가 아닐 수도 있다는 것입니다. 이 경우'string bufferstring (buffer);을 사용하면 모든 데이터를 포착 할 수 없습니다. –

+0

나는 그것이 길이라고 생각하지 않는다. 나는 이것을 얻게되어있다 : \ üèDqi¿ τy \ ╦îI█! ♠ ö. ↑ ΣΣ ~ אא י. ', gO6Ö ↓ ╥√«tª4yⁿ ° μÆ╪f╔öIƒÖ╠▄ßφ'' ~ √ß┐> ░ + αâ│ ╜ [ùΩππ╓└↔s≡ ± 이즘 * ▼ bºo«d┘ ■ ≡Ñde ± òù♀½Ö \ uú½,하지만이 무엇입니까! \ üèDqi¿ · τy ¥ ╦îI █! ♠ ■ ö. ↑ ▒Σ ~ ë┼éì. ', gO6Ö ↓ ╥√«'μÆ╪f╔öIƒÖ╠▄ßφy' ° tª4yⁿ & ~ √ß┐> ░ + αâ│fZ╗ {O ₧ ╦ ╜! [ùΩππ╓ └↔s≡ ± Ism * ▼ bºo«dһ ■ ≡Ñde ± òù ½ Ö \ \ \ ½ ½ ½. 어떤 이유로 중간에 여분의 문자가 있습니다. – IceKing

0

바이너리 데이터를 혼합 NUL들 수있다, 그래서 라인

string bufferstring(buffer); 

데이터를자를 수 있습니다. 이 라인 :

strcpy(buffer, bufferstring); 

는 절단의 동일한 문제를 가지고 있으며, 또한, 당신은 char * 표현을 얻을 수 std::string::c_str()를 호출해야합니다. 잘림을 방지하려면 memcpy()을 사용하십시오.

마지막으로 나는 do ... while() 패턴을 좋아하지 않습니다.

while((size = recvfrom(s, buffer, 128, 0, (LPSOCKADDR) &sa_in, &senderSize)) > 0) { 
    string bufferstring(buffer, size); 
    memcpy(buffer, bufferstring.c_str(), bufferstring.size()); 
    fwrite(buffer, sizeof(char), size, file); 
}