首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#编程总结(十)字符转码

Posted on 2014-02-10 16:08  停留的风  阅读(26108)  评论(4编辑  收藏  举报

C#编程总结(十)字符转码

为了适应某种特殊需要,字符需要根据规则进行转码,便于传输、展现以及其他操作等。

看看下面的转码,就知道他的用处了。

1、字符串转码

根据原编码格式与目标编码格式,完成转换。不过可能出现乱码哦。上一章已经介绍过了。

代码:

        /// <summary>
        /// 字符串编码转换
        /// </summary>
        /// <param name="srcEncoding">原编码</param>
        /// <param name="dstEncoding">目标编码</param>
        /// <param name="srcBytes">原字符串</param>
        /// <returns>字符串</returns>
        public static string TransferEncoding(Encoding srcEncoding, Encoding dstEncoding, string srcStr)
        {
            byte[] srcBytes = srcEncoding.GetBytes(srcStr);
            byte[] bytes = Encoding.Convert(srcEncoding, dstEncoding, srcBytes);
            return dstEncoding.GetString(bytes);
        }

测试用例:

            input = "欢迎来到转码世界!";
            result = Transfer.TransferEncoding(Encoding.Default, Encoding.UTF8, input);//欢迎来到转码世界!
            Console.WriteLine("TransferEncoding 结果:{0}",result);
            result = Transfer.TransferEncoding(Encoding.UTF8,Encoding.Default,result);
            Console.WriteLine("TransferEncoding 反转码结果:{0}", result);//欢迎来到转码世界!

 

2、Html转码

要点:将字符 < 和 > 在嵌入到文本块中时被编码为 &lt; 和 &gt;

如果在 HTTP 流中传递空白和标点之类的字符,则它们在接收端可能会被错误地解释。 HTML 编码将 HTML 中不允许使用的字符转换为等效字符实体;HTML 解码会反转此编码过程。 例如,为进行 HTTP 传输,字符 < 和 > 在嵌入到文本块中时被编码为 &lt; 和 &gt;。
要编码或解码 Web 应用程序之外的值,请使用 WebUtility 类。

转码:

        /// <summary>
        /// html转码
        /// </summary>
        /// <param name="html"></param>
        /// <returns></returns>
        public static string HtmlEncode(string html)
        {
            return HttpUtility.HtmlEncode(html);//System.Net.WebUtility.HtmlEncode(html);            
        }

解码:

        /// <summary>
        /// html解码
        /// </summary>
        /// <param name="html"></param>
        /// <returns></returns>
        public static string HtmlDecode(string html)
        {
            return HttpUtility.HtmlDecode(html);//System.Net.WebUtility.HtmlDecode(html);  
        }

 测试用例:

            //HtmlEncode测试
            result = string.Empty;
            input = "<head>you & me</head>";
            result = Transfer.HtmlEncode(input); //结果: &lt;head&gt;you &amp; me&lt;/head&gt;
            Console.WriteLine("Html Encode: {0}", result);
            result = Transfer.HtmlDecode(result);//结果: <head>you & me</head>
            Console.WriteLine("Html Decode: {0}",result);

  

3、Url编码

要点:对URL的特殊字符进行转义,使其合法。

可用于对整个 URL(包括查询字符串值)进行编码的方法。如果在 HTTP 流中传递空白和标点之类的字符,则它们在接收端可能会被错误地解释。 URL 编码将 URL 中不允许使用的字符转换为等效字符实体;URL 解码会反转此编码过程。 例如,当嵌入到要在 URL 中传输的文本块中时,字符 < 和 > 分别被编码为 %3c 和 %3e。

默认情况下 HttpUtility.UrlEncode 方法使用 UTF-8 编码。 因此,使用 UrlEncode 方法提供结果相同使用 UrlEncode 方法并指定 UTF8 作为第二个参数。
UrlEncode 是一种简便方式,用于在运行时从 ASP.NET 应用程序访问 UrlEncode 方法。 在内部,UrlEncode 使用 UrlEncode 方法输入字符串。
要编码或解码 Web 应用程序之外的值,请使用 WebUtility 类。

HttpUtility的命名空间:System.Web

Url转码

        /// <summary>
        /// Url转码
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string UrlEncode(string url)
        {
            return HttpUtility.UrlEncode(url);
        }

Url解码

        /// <summary>
        /// Url解码
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string UrlDecode(string url)
        {
            return HttpUtility.UrlDecode(url);
        }

 测试用例:

            //UrlEncode测试
            input = "http://www.baidu.com?username=<find>&content=ab c";
            result = Transfer.UrlEncode(input);//结果:http%3a%2f%2fwww.baidu.com%3fusername%3d%3cfind%3e%26content%3dab+c
            Console.WriteLine("Url Encode: {0}",result);
            result = Transfer.UrlDecode(result);//结果:http://www.baidu.com?username=<find>&content=ab c
            Console.WriteLine("Url Decode: {0}", result);

4、Base64

Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。

要点:采用64个基本的ASCII码字符对数据进行重新编码,用于加密和传输。

编码规则

Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个 “=”。

例:将对ABC进行BASE64编码:

1、首先取ABC对应的ASCII码值。A(65)B(66)C(67);
2、再取二进制值A(01000001)B(01000010)C(01000011);
3、然后把这三个字节的二进制码接起来(010000010100001001000011);
4、 再以6位为单位分成4个数据块,并在最高位填充两个0后形成4个字节的编码后的值,(00010000)(00010100)(00001001)(00000011),其中蓝色部分为真实数据;
5、再把这四个字节数据转化成10进制数得(16)(20)(9)(3);
6、最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D),这里的值实际就是数据在字符表中的索引。

BASE64字符表

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 

应用:

1、Base64编码可用于在HTTP环境下传递较长的标识信息

2、Base64 也会经常用作一个简单的“加密”来保护某些数据,比如URL,而真正的加密通常都比较繁琐。

代码实现

Base64转码

        /// <summary>
        /// Base64转码
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string ToBase64(string input)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(input);
            return Convert.ToBase64String(bytes);
        }

 

Base64解码:

        /// <summary>
        /// Base64字符串解码
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string FromBase64(string input)
        {
            byte[] bytes = Convert.FromBase64String(input);
            return Convert.ToBase64String(bytes);
        }

 测试用例:

            //Base64转码测试
            input = "Coming from the new world!";
            result = Transfer.ToBase64(input); //结果:Q29taW5nIGZyb20gdGhlIG5ldyB3b3JsZCE=
            Console.WriteLine("ToBase64 : {0}",result);
            result = Transfer.FromBase64(result); //结果:Coming from the new world!
            Console.WriteLine("FromBase64 : {0}", result);

 5、BitConverter

将基础数据类型与字节数组相互转换。
BitConverter 类以一系列字节的形式有助于操控基本窗体中的值类型。 一个字节定义为一个 8 位无符号整数。 如下表所示,BitConverter 类包括用静态方法将每个基元类型转换成字节数组和将字节数组转换成其基元类型。

Type

转换为字节

从字节转换

Boolean

GetBytes(Boolean)

ToBoolean

Char

GetBytes(Char)

ToChar

Double

GetBytes(Double)

- 或 -

DoubleToInt64Bits(Double)

ToDouble

- 或 -

Int64BitsToDouble

Int16

GetBytes(Int16)

ToInt16

Int32

GetBytes(Int32)

ToInt32

Int64

GetBytes(Int64)

ToInt64

Single

GetBytes(Single)

ToSingle

UInt16

GetBytes(UInt16)

ToUInt16

UInt32

GetBytes(UInt32)

ToUInt32

UInt64

GetBytes(UInt64)

ToUInt64

在这里我们以最基本的字符串类型为例说明。

byte转为String

        /// <summary>
        /// 字节数组转为字符串
        /// 将指定的字节数组的每个元素的数值转换为它的等效十六进制字符串表示形式。
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public static string BitToString(byte[] bytes)
        {
            if (bytes == null)
            {
                return null;
            }
            //将指定的字节数组的每个元素的数值转换为它的等效十六进制字符串表示形式。
            return BitConverter.ToString(bytes);
        }

 

十六进制string转byte

        /// <summary>
        /// 将十六进制字符串转为字节数组
        /// </summary>
        /// <param name="bitStr"></param>
        /// <returns></returns>
        public static byte[] FromBitString(string bitStr)
        {
            if (bitStr == null)
            {
                return null;
            }

            string[] sInput = bitStr.Split("-".ToCharArray());
            byte[] data = new byte[sInput.Length];
            for (int i = 0; i < sInput.Length; i++)
            {
                data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber);
            }

            return data;
        }

 测试用例:

            //bit转码
            input = "Coming from the new world!";
            result = Transfer.BitToString(Encoding.UTF8.GetBytes(input)); //结果: 43-6F-6D-69-6E-67-20-66-72-6F-6D-20-74-68-65-20-6E-65-77-20-77-6F-72-6C-64-21
            Console.WriteLine("BitToString : {0}", result);
            result = Encoding.UTF8.GetString(Transfer.FromBitString(result)); //结果:Coming from the new world!
            Console.WriteLine("FromBitString : {0}", result);

 运行截图: