2011-10-22 3 views
1

fint를 사용하여 uint8_t 유형의 배열을 씁니다. 터미널에서 프로그램을 실행 한 후 내가 사용할 때uint8_t 배열로 fwrite

cat file.txt 

모든 것이 그대로 출력됩니다. 그러나 나는 또한 노트 [noeol]의 하단에 내가 jibberish의 무리와 함께 슈퍼 꽝 파일,

^@^@^@^@^@^@... 

정력 주로 높은 repitition을 얻을

vim file.txt 

으로 파일을 열 때 열린 창

문맥 : udp 클라이언트/서버 파일 복사 프로그램. 내 새 파일을 diff 원본 파일이 필요; 그렇지 않습니다.

uint8_t buf[...]; 
recvfrom(...buf...); 
fwrite(buf...); 

원래 파일의 문자 길이는 150 자이며, 지껄 거리는 파일의 문자 크기는 ~ 30k입니다. 정력이 파일에 인쇄 할 수없는 문자가 발생할 때

내가

+2

포스트 일부 코드, 어떤 배열에 있습니다

코드는 (적절한 오류 검사와) 같은 것을 읽어야합니다. 대부분 바이너리 데이터를 작성하고 마술처럼 텍스트로 나타나기를 기대합니다. – littleadv

+0

감사합니다! 거기에 몇 가지 코드를 추가했습니다. uint8을 chars로 변환하려고합니다. 또는 서명되지 않은 문자? – austin

+0

그리고 아마 당신이 요청한만큼 실제로 당신이 받았는지 확인하지 않을 것입니다. –

답변

1

오스틴 대답이나 방향
모든 종류의 감사하겠습니다, 그것을 표현하기 위해 이스케이프 코드를 사용합니다. ^@ 이스케이프 코드는 null 문자 (즉, C에서는 '\0')를 나타내는 데 사용됩니다. 이 문자는 인쇄 할 수 없으므로 콘솔은 cat file.txt을 수행 할 때 폐기합니다.

그래서 코드가 fwrite 전화로 잘못된 크기를 전달하고 있다고 생각합니다. 수신 된 데이터의 크기 대신 버퍼의 크기가 전달됩니까?

uint32_t datalen; 
uint8_t buffer[BUFSIZE]; 
datalen = recvfrom(s, buffer, BUFSIZE, flags, &from, &from_len); 
fwrite(buffer, 1, datalen, f); 
+0

거룩한 쓰레기. 신의 선물. Sylvian Defresne은 보스입니다. 나는 실제로 recvfrom가 필요한 수를 반환한다는 것을 깨닫지 못하고 버퍼 크기의 정적 길이로 쓰고있었습니다. 머리를 가져 주셔서 감사합니다. 전체 프로그램은 놀랍게 작동합니다. – austin