六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 101|回复: 0

编码和解码笔记

[复制链接]

升级  22%

78

主题

78

主题

78

主题

举人

Rank: 3Rank: 3

积分
266
 楼主| 发表于 2013-2-7 04:19:10 | 显示全部楼层 |阅读模式
命名空间
 
using System.Text; 
将字符序列转换成字节序列的过程叫做编码
将字节反序列转换成字符序列的过程叫做解码
在C#中,字符默认都是Unicode码,即一个英文字符占两个字节,一个汉字也占两个字节
UTF是通用转换格式,一般用1-4个字节编码一个Unicode码。目前流行的UTF-8、UTF-16、UTF-32 
 
    //获取所有编码的名称和描述        private void BindCodeType()        {            EncodingInfo[] enCodingInfo = Encoding.GetEncodings();            foreach (EncodingInfo ei in enCodingInfo)            {                Encoding en = ei.GetEncoding();                comboBox1.Items.Add(string.Format("{0}[{1}]", en.HeaderName , en.EncodingName));            }            comboBox1.SelectedIndex = comboBox1.FindString("gb2312");        }        //获取指定的编码的描述        private void GetEncode()        {            string  edName = Encoding.GetEncoding("gb2312").EncodingName;            MessageBox.Show(edName);        }  //不同编码之间的转换        private void ConvertCode()        {            string str = "猜猜我是谁";            Byte[] unicodeBytes = Encoding.Unicode.GetBytes(str);            Byte[] utf8Bytes=Encoding.Convert (Encoding.Unicode ,Encoding.UTF8 ,unicodeBytes);            string result = Encoding.UTF8.GetString(utf8Bytes);            MessageBox.Show(result);        } 
当网络传输时,如果数据量较大,需要将其分开传输。如果直接使用Encoding类的GetBytes()方法,可能会出现一个数据快的末尾是一个高代理项,而与其对应的低代理项在下一个数据块中。此时,使用Encoder类可以很好地解决这个问题。
 
   //Encoder类的构造函数是Protected的,所以不能直接实例化Encoder对象,而要通过Encoding类的GetEncoder()方法类实例化对象        //创建Encoder的实例(如UTF-8编码)        Encoder ed = Encoding.UTF8.GetEncoder();//Encoder对象的GetBytes()方法(编码)        //Encoder对象的GetByteCount()方法获取字符数组序列化后得到的字节数组的长度        private byte[] EncoderGetBytes(string str)        {                    char[] chars = str.ToCharArray();            Encoder ed = Encoding.UTF8.GetEncoder();            Byte[] bytes = new Byte[ed.GetByteCount(chars, 0, chars.Length, true)];            ed.GetBytes(chars, 0, chars.Length, bytes, 0, true);            return bytes;        }        //Decoder对象GetChars()方法        //Decoder对象的GetCharCount()方法获取字节数组反序列化后得到的字符数组的长度        private string DecoderGetChars(Byte[] bytes)        {            Decoder dd = Encoding.UTF8.GetDecoder();            char[] chars = new char[dd.GetCharCount(bytes, 0, bytes.Length, true)];            dd.GetChars(bytes, 0, bytes.Length, chars, 0, true);            StringBuilder sb = new StringBuilder(100);            foreach (char c in chars )            {                sb.Append(c);            }            return sb.ToString();        } 
 
下面是一个例子
 
/*********************************************************************  * 创建人:Devilhand * 创建时间:2010-9-8 * 说明: 编码和解码 ********************************************************************/using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace 编码和解码{    public partial class EncodeAndDecode : Form    {        private string codeType = null;//编码类型        Byte[] bytes;//字节数组         public EncodeAndDecode()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            MyEncode();            MyDecode();        }        private void Form1_Load(object sender, EventArgs e)        {            textBox1.Text = "猜猜我是谁?";            textBox2.ReadOnly = textBox3.ReadOnly = true;            BindCodeType();        }        //获取所有编码的名称和描述        private void BindCodeType()        {            EncodingInfo[] enCodingInfo = Encoding.GetEncodings();            foreach (EncodingInfo ei in enCodingInfo)            {                Encoding en = ei.GetEncoding();                comboBox1.Items.Add(string.Format("{0}[{1}]", en.HeaderName, en.EncodingName));            }            comboBox1.SelectedIndex = comboBox1.FindString("gb2312");        }        //编码        private void MyEncode()        {            codeType = comboBox1.SelectedItem.ToString();            codeType = codeType.Substring(0, codeType.IndexOf('['));            Encoder ed = Encoding.GetEncoding(codeType).GetEncoder();            char[] chars = textBox1.Text.Trim().ToCharArray();            bytes = new Byte[ed.GetByteCount(chars, 0, chars.Length, true)];            ed.GetBytes(chars, 0, chars.Length, bytes, 0, true);            textBox2.Text = Convert.ToBase64String(bytes);        }        //解码        private void MyDecode()        {            Decoder dd = Encoding.GetEncoding(codeType).GetDecoder();            //Decoder dd = Encoding.Default.GetDecoder();            char[] chars = new char[dd.GetCharCount(bytes, 0, bytes.Length, true)];            dd.GetChars(bytes, 0, bytes.Length, chars, 0, true);            StringBuilder result = new StringBuilder(1000);            foreach (char c in chars)            {                result.Append(c);            }            textBox3.Text = result.ToString();        }    }} 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表