UWP 解压 GZIP
准备工作:
通过 NUGET 安装 Microsoft.Bcl.Compression ;
使用命名空间
using System.IO.Compression ;
- public static async Task<string> Get(string url)
- {
- WebRequest request = WebRequest.CreateHttp(new Uri(url)); //创建WebRequest对象
- request.Method = "GET"; //设置请求方式为GET
- request.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0";
- request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate"; //设置接收的编码 可以接受 gzip
- var response = await request.GetResponseAsync();
- Stream stream = null;
- stream = response.Headers[HttpRequestHeader.ContentEncoding].Equals("gzip",
- StringComparison.CurrentCultureIgnoreCase) ? new GZipStream(response.GetResponseStream(), CompressionMode.Decompress) : response.GetResponseStream();
- var ms = new MemoryStream();
- var buffer = new byte[];
- while (true)
- {
- if (stream == null) continue;
- var sz = stream.Read(buffer, , );
- if (sz == ) break;
- ms.Write(buffer, , sz);
- }
- var bytes = ms.ToArray();
- var html = GetEncoding(bytes, response.Headers[HttpRequestHeader.ContentType]).GetString(bytes);
- await stream.FlushAsync();
- return html;
- }
获取编码:
- public static Encoding GetEncoding(byte[] bytes, string charSet)
- {
- var html = Encoding.UTF8.GetString(bytes);
- var regCharset = new Regex(@"charset\b\s*=\s*""*(?<charset>[^""]*)");
- if (regCharset.IsMatch(html))
- {
- return Encoding.GetEncoding(regCharset.Match(html).Groups["charset"].Value);
- }
- if (string.IsNullOrEmpty(charSet))
- {
- return Encoding.UTF8;
- }
- try
- {
- // 解决 gbk gb2312
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- return Encoding.GetEncoding(charSet);
- }
- catch (Exception)
- {
- return Encoding.UTF8;
- }
- }
虽然使用 HttpClient 更简单
- var http = new HttpClient();
- http.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0");
- http.DefaultRequestHeaders.Add("accept-encoding", "gzip, deflate");
- var response = await http.GetAsync(new Uri(url));
- response.EnsureSuccessStatusCode();//确保请求成功
但是它的响应头并没有 “Content-Encoding” ,所以无法直接判断需不需要 Gzip 解压。
UWP 解压 GZIP的更多相关文章
- curl解压gzip页面gzcompress内容
$headers = array( //"Content-type:application/json;charset='utf-8'", "Cache-Control:n ...
- 解压gzip格式文件(包括网页)
先上源码 参数说名: - source :gzip格式流内容. - len: gzip流长度 - dest: 解压后字符流指针 - gzip: 压缩标志,非0时解压gzip格式,否则按照zip解压 说 ...
- HttpWebResponse 解压gzip、deflate压缩
需要使用到两个Stream的子类:GZipStream.DeflateStream,代码如下: public string GetResponseBody(HttpWebResponse respon ...
- C# 解压gzip文件(.tgz)
1.引用 SharpCompress.dll 2.代码 using System;using System.IO;using System.Text;using SharpCompress.Reade ...
- httplib 和 httplib2区别之 gzip解压
HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Content-e ...
- 压缩及解压命令gzip、bzip2、tar
1. gzip 描述:压缩与解压缩 用法:gzip[选项]...[文件名称]... 选项:-d 解压 gzip hello.txt # 文件压缩后名为hello.txt.gz gzip -d ...
- *.tar 用 tar –xvf 解压 *.gz 用 gzip -d或者gunzip 解压 *.tar.gz和*.tgz 用 tar –xzf 解压 *.bz2 用 bzip2 -d或者用bunzip2 解压 、*.tar.bz2用tar –xjf 解压
解压: 1.*.tar 用 tar –xvf 解压, --skip-old-files跳过已经存在的文件,压缩用tar -cvf 2.*.bz2 用 bzip2 -d或者用bunzip2 解压 3.* ...
- GZip 压缩解压 工具类 [ GZipUtil ]
片段 1 片段 2 pom.xml <dependency> <groupId>commons-codec</groupId> <artifactId> ...
- [Linux] 解压tar.gz文件,解压部分文件
遇到数据库无法查找问题原因,只能找日志,查找日志的时候发现老的日志都被压缩了,只能尝试解压了 数据量比较大,只能在生产解压了,再进行查找 文件名为*.tar.gz,自己博客以前记录过解压方法: h ...
随机推荐
- [Java] JDK 系统环境变量设置 bat
@echo off set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmen ...
- 【读书笔记】iOS-UIWindow-WindowLevel
WindowLevel是UIWindow的一个属性.系统定义的一共有3种. UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; UIKIT_EX ...
- C语言-11-可变参数的实现方案
概述 某种情况下,我们可能需要一个具有可变参数的函数,C语言提供了一种标准的实现可变参数的方法 C语言实现可变参数的方案是基于标准库的 可变参数的类型 可变参数可以放在一个集合中,可以使用指针类型的参 ...
- iOS开发之网络编程--使用NSURLConnection实现大文件下载
主要思路(实现下载数据分段写入缓存中) 1.使用NSURLConnectionDataDelegate以及代理方法.2.在成功获取响应的代理方法中,获得沙盒全路径,并在该路径下创建空文件和文件句柄.3 ...
- [转]个人源码管理:如何在本机配置自己的SVN Repository (图解)
本文转自:http://blog.csdn.net/wikijava/article/details/6245588 Repository 即源码的集中存放处,所有修改后提交的源码就是保存在这里,并在 ...
- Erlang数据类型的表示和实现(4)——boxed 对象
Boxed 对象 Boxed 对象是比较复杂的对象,在 Erlang 中主标签为 10 的 Eterm 表示一个对 boxed 对象的引用.这个 Eterm 除去标签之后剩下的实际上是一个指针,指向具 ...
- EF+MVC+cod First项目性能优化总结
1.EF:this.Configuration.UseDatabaseNullSemantics = true; //关闭数据库null比较行为 2.实体必填字段要加:[Required]属性,可定长 ...
- SharePoint 指定配置数据库访问账户“域账户\用户”
大家在安装sharepoint时都会遇到这个问题,域账户,什么是域账户哪?域账户简单理解就是网路账户,与本地账户不同,什么是域哪?域就是控制器. 一台Windows 计算机,它要么隶属于工作组,要么隶 ...
- Button未设type属性时在非IE6/7中具有submit特性
代码如下 <!DOCTYPE html> <html> <head> <title>Button在Form中具有submit的特性</title& ...
- poj 3177 Redundant Paths
题目链接:http://poj.org/problem?id=3177 边双连通问题,与点双连通还是有区别的!!! 题意是给你一个图(本来是连通的),问你需要加多少边,使任意两点间,都有两条边不重复的 ...