首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows MSVC上使用wininet下载deflate XML,但得到损坏的数据

在Windows MSVC上使用wininet下载deflate XML,但得到损坏的数据
EN

Stack Overflow用户
提问于 2020-07-28 21:20:10
回答 1查看 62关注 0票数 0

这段代码下载泄气的XML文档https://api.bilibili.com/x/v1/dm/list.so?oid=162677333并将其保存到temp.Z,但是它似乎坏了。怎么会这样呢?

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <wininet.h>

#pragma comment(linker, "/entry:\"mainCRTStartup\"")
#pragma comment(lib, "wininet.lib")

char *download(char *link, int *size)
{
    int prealloc_size = 100000;
    char *buf = malloc(prealloc_size);
    DWORD num;
    HINTERNET hinet;
    HINTERNET hurl;
    *size = 0;

    hinet = InternetOpen("Microsoft Internet Explorer",
        INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_INVALID_PORT_NUMBER);
    hurl = InternetOpenUrl(hinet, link, NULL, 0, INTERNET_FLAG_NEED_FILE, 0);
 
    while (TRUE == InternetReadFile(hurl, buf + *size, 1024, &num) && num > 0)
    {
        *size += num;
        
        if (*size + 1024 > prealloc_size)
        {
            prealloc_size += prealloc_size / 2;
            buf = realloc(buf, prealloc_size);
        }
    }
    
    InternetCloseHandle(hurl);
    InternetCloseHandle(hinet);
    return buf;
}

int main(void) 
{
    char *link = "https://api.bilibili.com/x/v1/dm/list.so?oid=162677333";
    FILE *f = fopen("temp.Z", "wb");
    int siz;
    char *dat = download(link, &siz);
    
    fwrite(dat, 1, siz, f); 
    fclose(f);
    free(dat);
    
    return 0;
}

我尝试了Fiddler,它得到了相同的数据,然而,Fiddler可以解码它,并说它是压缩的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-29 01:30:22

它介于deflate、zlib和gzip之间。我不知道。但我现在可以破解了。

只需使用带有inflateInit2(&strm, -MAX_WBITS)zlib,而不是inflateInit(&strm)

是的,这是非常好的。但是为什么我会认为它坏了呢?因为我的档案管理员不会解码这个!无论如何,我需要自己调用zlib。我曾建议存档管理器开发人员添加此功能--这很有用,不是吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63135121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档