【问题标题】:Why download file is too big?为什么下载文件太大?
【发布时间】:2015-11-15 06:14:15
【问题描述】:

我想将文件http://img1.ak.crunchyroll.com/i/croll_manga/e/257692e8c297b8907e2607964454b941_1438752352_main 下载到字符串。

我在 C++ 中编写了函数

string opener(string url)
{
  CURL *curl;
  CURLcode res;
  std::string readBuffer;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
  }
  return readBuffer;
}

这工作正常。

我用 C# 编写了这个类

namespace Crmrip
{
    class opener
    {
        public static string open(string url)
        {

            using (WebClient page = new WebClient())
            {
                try
                {
                    page.Encoding = Encoding.UTF8;
                    page.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0";
                    string result = page.DownloadString(url);
                    return result;
                }

                catch (WebException er)
                {
                    MessageBox.Show(er.ToString());
                    return null;
                }
            }

        }
    }
}

这个类不能正常工作。下载的文件太大。 用 C++ 下载的文件有 487 778 字节,没问题。 用C#下载的文件有879 910,太大了。

为什么用 C# 下载的文件太大?

【问题讨论】:

  • 你试过用page.DownloadFile代替page.DownloadData吗?
  • 你的代码编译了吗?据我所知page.DownloadData 返回byte[] 但你把它输入string
  • 抱歉,我粘贴了错误的代码。正确的应该是 page.DownloadString(url)。 page.DownloadData 来自我的测试下载文件作为数据。这是我为应用程序编写的类文件的代码,是的,代码是编译给我的代码。
  • 来自 URL 的图像我想保存在磁盘上,但首先我必须通过 0x42 异或来解密他。

标签: c# c++ curl


【解决方案1】:

使用DownloadData 以字节数组形式获取响应。执行 XOR 并将结果写入文件

所以稍微修改一下你的代码:

using (WebClient page = new WebClient())
{
    try
    {
        byte[] result = page.DownloadData(url);
        for(int i=0;i<result.Length;i++)
        {
            result[i] ^= 0x42;
        }
        File.WriteAllBytes(filename, result);
    }

    catch (WebException er)
    {
        MessageBox.Show(er.ToString());

    }
}

【讨论】:

【解决方案2】:

似乎有效:

void Main()
{
    string url = "http://img1.ak.crunchyroll.com/i/croll_manga/e/257692e8c297b8907e2607964454b941_1438752352_main";
    Console.WriteLine(open(url));
}


 public static async Task<string> open(string url)
    {

        using (HttpClient page = new HttpClient())
        {
            try
            {
                //page.Encoding = Encoding.UTF8;
                //page.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0";
                page.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0");
                return await page.GetStringAsync(url);
            }

            catch (Exception er)
            {
                //MessageBox.Show(er.ToString());
                return null;
            }
        }

    }

我不确定编码是否会成为问题 - 这是reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-10
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多