InternetReadFile 在末尾返回带有额外字符的文本

Posted

技术标签:

【中文标题】InternetReadFile 在末尾返回带有额外字符的文本【英文标题】:InternetReadFile returns text with extra characters at the end 【发布时间】:2016-09-13 12:11:05 【问题描述】:
HINTERNET hInternet, hFtpSession, hFile;

    hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    hFtpSession = InternetConnect(hInternet, FTPHOST, INTERNET_DEFAULT_FTP_PORT,
        FTPUSER, FTPPASS, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
    hFile = FtpOpenFile(hFtpSession, argv[1], GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);

    DWORD rSize;
    char tmp[2048];
    string buffer;

    while(InternetReadFile(hFile, tmp, 2048, &rSize) && rSize > 0)
    
        buffer += (string)tmp;
    

    cout << buffer;

    InternetCloseHandle(hFile);
    InternetCloseHandle(hFtpSession);
    InternetCloseHandle(hInternet);

我有这个小程序从 FTP 服务器读取文本文件到字符串,但是在读取字符串的末尾有一些额外的字符。我想问题出在文本的大小上,但我无法弄清楚。

例如我想下载一个加密的文本,它会像这样被破坏

MIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAp2q+92EQPncY0sN6SMTC0yh05GpZ
FUEGATvUx/zcUrzdDTva5JKz0MztuCn3lnHmaUB6L97w8fuVOhJjj90ItH4FdUk4R9m50son
DSZ4ad5ZKi7WE7GApIq21vgM0zoG5sr0Xb6X41IQgvYF7i9nX4zKO2znRyD3uzBqkqkhWzbS
HI2euCdhmXfx2az0ynNKrcnQINaWowipc0LrW0Q9PWI1McCs4V5sz8GkBMpKENb3m/LBlSqz
TboC/9hiD9Yfclvk3wFeNGvsnUUDpwZipF9cBMVzmfyjA1gBDNLV8qcTXSortHaGeHdLpqIg
Qn3SpDol8gPRis7A7Hy4KjRS8Y/iZa8Nv9EmEeful6u3IHY0Qror/wOeST5WhaTynVBT0wgP
6GSMWsofwA3NttsFCw55z5c8GBEGP6Uo+jP/rdiYvednT0iV8Grp+XJ6zMFqYlVcLqAzQWLw
dfqve/lr8+OKfR9WvG6hvrVduTnoy+LBFF/QEVxAlZqymlXMm/hcO/TUoE1Kmon6FwID4Mek
nV1eb1aCmUIzxFHtPkMO0KFitmxa5EGwAFHRAjXrp2lUHIQSaWwVnsfoQgmrG9ux2I27w+WR
8kFdkqWrutFz2xn6ovVwla7Oj0iL2f9azNO2Z2KT/sBPwGmI67M9Ceih0YLD0w7Woy32H2aM
mIeK368CARE=
8

8 不应该在最后。

【问题讨论】:

string 不是 C 类型。请不要将此问题标记为C。此外,您不能在 C 中重载运算符(如 buffer += ...)这个问题与 C 无关。请编辑问题并去掉 C 标记。 【参考方案1】:

函数 InternetReadFile 不会终止缓冲区,因此数组 tmp 的内容不是字符串,但您将其视为字符串。

行为未定义。

删除这一行:

buffer += (string)tmp;

改为使用字符串函数 append 的重载,它接受一个数组及其大小:

buffer.append( tmp , rSize );

【讨论】:

我明白了,但是我怎样才能将缓冲区转换为字符串或者我应该怎么做?【参考方案2】:

正如 2501 所说,您没有考虑 NULL 终止符,所以您想要做的是这样的

DWORD rSize;
char tmp[2048+1];
string buffer;

while(InternetReadFile(hFile, tmp, 2048, &rSize) && rSize > 0)

    tmp[rSize] = '\0';
    buffer += (string)tmp;

【讨论】:

以上是关于InternetReadFile 在末尾返回带有额外字符的文本的主要内容,如果未能解决你的问题,请参考以下文章

InternetReadFile() 读取数据但返回 false 并将读取的字节数设置为零

InternetReadFile 填充缓冲区,但返回读取的零字节

异步使用 InternetReadFile() 的正确方法

InternetReadFile() 似乎没有读取互联网数据

InternetReadFile 因分块响应而失败

InternetReadFile 问题(错误 87 - 参数不正确)