`

编码与解码【转】

    博客分类:
  • C#
阅读更多
/*********************************************************************
* 创建人:Devilhand
* 创建时间:2010-9-8
* 说明: 编码和解码
********************************************************************/


将字符序列转换成字节序列的过程叫做编码
将字节反序列转换成字符序列的过程叫做解码
在C#中,字符默认都是Unicode码,即一个英文字符占两个字节,一个汉字也占两个字节
UTF是通用转换格式,一般用1-4个字节编码一个Unicode码。目前流行的UTF-8、UTF-16、UTF-32
       //命名空间
        using System.Text;
        //获取所有编码的名称和描述
        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();
        }


下面是一个例子
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();
        }

    }
}
分享到:
评论

相关推荐

    航信汉字编码与解码/eterm汉字编码与解码

    航信汉字的编码与解码,编码便于使自己的pid进行汉字传输, 航信汉字编码与解码,eterm汉字编码与解码,汉字编码问题

    旋转编码器解码程序

    旋转编码器解码程序 旋转编码器解码程序是用于判别旋转编码器的旋转方向的程序,该程序提供了编码器的电路连接示意图,通过对旋转编码器的输入信号进行处理,可以确定其旋转方向。 在该程序中,定义了两个输入引脚...

    PCM编码与解码仿真实验报告.doc

    实验中遇到的问题可能包括信号失真、编码解码不匹配等,解决这些问题通常需要调整编码和解码参数,确保信号处理过程的精确性。在数字通信中,抽样、量化和编码是模拟信号数字化的三个关键步骤。抽样是指按照一定频率...

    哈夫曼编码与解码(C语言实现)

    在C语言中实现哈夫曼编码与解码,主要分为以下几个步骤: 1. **创建哈夫曼树**: - 首先,我们需要收集输入数据的频率,如字符出现的次数。 - 然后,将这些频率作为权重,创建一个优先队列(通常用最小堆实现)。...

    json编码与解码

    json编码与解码json编码与解码json编码与解码json编码与解码json编码与解码json编码与解码json编码与解码

    《卷积编码与解码的MATLAB实现及性能分析》.docx

    《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的...

    曼彻斯特编码、解码

    C语言是一种强大的编程语言,用于编写这样的编码和解码函数是非常合适的。以下是对曼彻斯特编码和解码的详细解释: 1. **曼彻斯特编码过程**: - 每一位数据被分成两个相等的时间段。 - 如果原始数据位是0,...

    数字彩色图像的哈夫曼编码与解码的matlab实现

    每组数据个数为 1920×1080,并对这三组数据分别进行哈夫曼编码和解码。计算熵和码字的平均码长。 (2)将彩色图像的像素 R、G、B 值作为独立符号,进行哈夫曼编码和解码,计算熵和码字平均码长。 (3)将彩色图像的...

    RLE编码与解码算法及过程

    "编码解码过程详细解释" 文件可能是一个文本文件或者文档,详细阐述了RLE编码和解码的逻辑和步骤,可能会有示例和图示,帮助读者更好地理解和应用这种算法。 在实际应用中,RLE编码常用于图像处理,因为图像中常常...

    huffman编码与解码

    huffman编码与解码附带数据结构答案

    C++ jpeg图像编码与解码_C++jpeg图像编码与解码_C++JPEG编码_jpeg论文c++_

    至于“jpeg论文c++”,这可能是指使用C++实现JPEG编码解码时参考的学术论文。这类论文通常会深入探讨算法的优化、性能分析和可能的改进方案。通过阅读这些论文,开发者可以获得更深入的理解,并可能找到提高编码速度...

    短信UCS编码或解码工具

    5. **UTF-8**:UTF-8是Unicode的变体,它可以高效地表示各种语言的字符,而且对于ASCII字符,UTF-8编码与ASCII编码完全相同,这使得它在互联网上非常流行。 短信开发过程中,PDU(Protocol Data Unit,协议数据单元...

    C++URL编码和解码

    C++作为一门强大的系统级编程语言,虽然没有内置的URL编码和解码函数,但开发者可以借助标准库和第三方库来实现这些功能。本文将深入探讨C++中如何进行URL编码和解码。 URL(Uniform Resource Locator)是互联网上...

    哈夫曼编码与解码的程序

    在C语言中实现哈夫曼编码与解码的过程包括几个关键步骤:构造哈夫曼树、生成哈夫曼编码、编码文件和解码文件。 1. 构造哈夫曼树: - 首先,统计输入文本中每个字符出现的频率。 - 然后,创建一个最小堆(优先队列...

    tlv的java编码和解码

    - **源码包**:包含了实现TLV编码解码的Java源代码,可以学习和理解其内部实现逻辑。 - **Demo**:一个带有详细注释的示例程序,展示了如何使用这个库进行编码和解码操作,可以帮助开发者快速上手。 为了更好地利用...

    base64 编码与解码 中文完美支持

    总的来说,Base64编码与解码技术在现代网络通信中扮演着重要角色,特别是在处理包含非ASCII字符集的数据时,如中文字符。这个"完美支持中文"的Base64工具通过高效和准确的实现,为开发者提供了一种可靠的解决方案,...

    旋转编码器解码的工作原理与应用

    "旋转编码器解码的工作原理与应用" 旋转编码器解码的工作原理与应用可以分为以下几点: 1. 旋转编码器的结构:旋转编码器的结构主要由玻璃码盘、上排A相、下排B相、灰色的不透光和白色的透光组成。其中,Z相为零...

    《码书:编码与解码的战争》

    《码书:编码与解码的战争》是一本深入探讨编码与解码技术的书籍,主要聚焦于计算机科学中的编码理论及其在实际应用中的战争。这本书可能是为Java开发者或者对编码感兴趣的读者准备的,因为其标签明确指向了“java”...

    短信pdu编码解码_短信_短信PDU编码_pdu_

    短信PDU编码与解码是通信领域中一个关键的概念,特别是在GSM(全球系统移动通信)网络中,用于传输文本消息。PDU全称为Protocol Data Unit(协议数据单元),是SMS(Short Message Service,短消息服务)在GSM网络...

    网页版PDU格式编码_解码

    而在线PDU格式编码_解码 使用AT指令发送中文短信_files很可能是与HTML页面相关的资源文件,包括CSS样式表、JavaScript脚本或其他辅助文件,这些文件共同确保了工具的正常运行和用户体验。 总的来说,这款网页版的...

Global site tag (gtag.js) - Google Analytics