我有一个我要传输的二进制文件,基本上我想知道我是否将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(binary)变成字符串,然后变回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);
答案 0 :(得分:2)
这样做:
string bufferstring(buffer);
表示使用以null结尾的字符串作为输入。 buffer
中的数据可能不是长度为127的以空字符结尾的字符串。如果它更短,则会导致数据丢失,如果缓冲区中没有空终止符,则会导致未定义的行为。
下一行strcpy(buffer, bufferstring);
甚至无法编译; std::string
不能用作strcpy
的参数。
之后你从buffera
开始写作,甚至没有定义。
您的第一个代码版本是否存在某些问题,导致您想要更改它?
答案 1 :(得分:0)
二进制数据可能混有NUL
,所以行
string bufferstring(buffer);
可能会截断数据。这一行:
strcpy(buffer, bufferstring);
具有相同的截断问题,而且,您需要调用std::string::c_str()
来获取char *
表示。使用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);
}