将c_string转换为字符串并返回c_string时数据表示丢失

时间:2014-10-23 22:46:52

标签: c++

我有一个我要传输的二进制文件,基本上我想知道我是否将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);

2 个答案:

答案 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);
}