将c_string转换为字符串再转换回c_string时数据表示形式丢失

Data representation loss when converting c_string to string and back to c_string

本文关键字:string 转换 数据表示 字符串      更新时间:2023-10-16

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

这样做:

string bufferstring(buffer);

表示使用以null结尾的字符串作为输入。CCD_ 1中的数据可能不是长度正好为127的以空结尾的字符串。如果时间较短,则数据丢失,并且缓冲区中没有null终止符,则会导致未定义的行为。

下一行,strcpy(buffer, bufferstring);甚至没有编译;std::string不能用作strcpy的参数。

在那之后,你从buffera开始写作,它甚至没有定义。

您的第一个版本的代码是否有问题,导致您想要更改它?

二进制数据可能混合了NUL s,因此行

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