我正在使用fwrite来编写类型为uint8_t的数组。在终端中,运行程序后,当我使用
时cat file.txt
一切都按照应有的方式打印。 但是当我用
打开文件时vim file.txt
我得到一个带有一堆乱七八糟的超级打击文件,主要是高重复的
^@^@^@^@^@^@...
vim还注意到打开窗口底部的[noeol]
问题的上下文:udp客户端/服务器文件复制程序。我需要原始文件与我的新文件差异;它没有。
uint8_t buf[...];
recvfrom(...buf...);
fwrite(buf...);
原始文件有〜150个字符,jibberish文件有~30k个字符。
我很感激任何答案或方向
-austin
答案 0 :(得分:1)
当vim在文件中遇到不可打印的字符时,它使用转义码来表示它。 ^@
转义码用于表示空字符(即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);