将c_string转换为字符串再转换回c_string时数据表示形式丢失
Data representation loss when converting c_string to string and back to c_string
我有一个想要传输的二进制文件,基本上我想知道我是否将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);
}
相关文章:
- 使用char类型将decimal转换为string,将string转换为decimal
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无法从'const std::string [3]'转换为'std::string'
- 从 std::string 转换为 const 无符号整数
- C++ 模板函数无法将"std:string"转换为"double"作为回报
- 将 std::string 转换为 const char* 用于 printf 消耗
- 将 std::string 转换为 const tchar*
- 如何在PHPCPP库中将C++map<string,map<string>>转换为php::value?
- 将 std::string 转换为具有特殊字符的 FString (TCHAR / wstring)
- 将 std::string 转换为 wchar_t* 的类型定义
- 在 C++03 中将 std::string 转换为 int
- 将 'hana::string' 转换为 'constexpr const char (&)[]'
- 正确的交叉平台从 std::string 转换为 'const TCHAR *'
- 从矢量<string>转换为wchar_t**
- 将 std::vector<std::string> 转换为 const char* const*
- 将 std::string 转换为 boost::asio::streambuf
- C++ SNAP 库将 std::string 转换为 TStr
- 自动将 std::string 转换为 char* 而无需每次都调用 c_str() 的最佳方法
- 将 std::string 转换为 Swift String