博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
六、网络数据编码与解码
阅读量:4657 次
发布时间:2019-06-09

本文共 3695 字,大约阅读时间需要 12 分钟。

  编码:是指将一组字符转换为一个字节序列的过程。

  解码:将一个编码字节序列转换为一组字符的过程。 为什么需要编码和解码因为通过网络传递的数据必须是字节序列。

  常用编码:ASCII、Unicode、UTF、国标码

  常用编码 ASCII码:

  每个字符均为7位,主要针对英文。

  UNICODE码:每个字符均占两个字节。

  UTF码:通用转换码,主要解决编码容量问题,

  常用有

  (1)UTF-8:用1到4个字节编码一个UNICODE字符

  (2)UTF-16:将每个字符编码为1至2个16位整数组成的序列

  (3)UTF-32:将每个字符编码为一个32位整数 国标码:常用有 GB2312(1980年公布) GB18030(2000年公布)

  Encoding类

  Encoding类位于System.Text命名空间中。常用属性及方法如下:

名称

说明

Default属性

获取系统的当前ANSI代码页的编码

Unicode属性

获取使用 Little-Endian 字节顺序的 UTF-16 格式的编码

UTF8属性

获取UTF-8格式的编码

Convert方法

将字节数组从一种编码转换为另一种编码

GetBytes方法

将一组字符编码为一个字节序列

GetString方法

将一个字节序列解码为一个字符串

GetEncoder方法

获取一个解码器,该解码器将Unicode字符序列转换为已编码的字节序列

GetDecoder方法

获取一个解码器,该解码器将已编码的字节序列转换为字符序列

  

  1.获取所有编码名称及其描述信息

  GetEncodings方法获得包含所有编码的EncodingInfo数组。

  下面的代码可以获取所有编码的名称及其名称描述。

  

foreach (EncodingInfo ei in Encoding.GetEncodings())            {                Encoding en = ei.GetEncoding();                Console.WriteLine(string.Format("{0,-18}{1}", ei.Name, en.EncodingName));            }

  2.获取某个指定的编码描述信息

    (1)访问UTF8、ASCII等属性,直接获得其他非Unicode的某个指定字符集的编码实例。

    Encoding ASCIIEncode = Encoding.ASCII;

    (2)利用静态方法GetEndcoing来获取编码实例,

    例如: Encoding GB2312Encoding = Encoding.GetEncoding("GB2312");

    (3)访问HeaderName属性,获取指定编码的名称

    Console.WriteLine(GB2312Encoding. HeaderName);

    (4)访问EncodingName属性,显示指定编码的名称描述                 

    Console.WriteLine(GB2312Encoding.EncodingName);

  3.不同编码之间的转换

    功能:Encoding类的Convert方法可将字节数组从一种编码转换为另一种编码,转换结果类型为byte[] 。

    方法原型: public static byte[] Convert(Encoding srcEncoding, Encoding dstEncoding, byte[] bytes)

    参数说明:

      srcEncoding表示源编码格式。

      dstEncoding表示目标编码格式。

      bytes参数指定了待转换的字节数。

      将Unicode字符串转换为UTF8字符串时,可参考以下的步骤进行。

  将Unicode字符串转换为UTF8字符串:

    (1)利用Encoding的UTF8和Unicode属性获取UTF8格式的编码实例utf8和Unicode格式的编码实例unicode,

    例如:

       string unicodeString = "含unicode字符Pi(\u03a0)";             Encoding unicode = Encoding.Unicode;             Encoding utf8 = Encoding.UTF8;

 

 

    (2)利用unicode的GetBytes方法将Unicode字符编码为Unicode字节数组,

    例如: 

      byte[] unicodeBytes = unicode.GetBytes(unicodeString);

    (3)利用Encoding的Convert方法将Unicode字节数组转换为UTF8字节数组,

    例如: 

      byte[] utf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, unicodeBytes);

 

    (4)最后,利用ut8的GetString方法将UTF8字节数组解码为UTF8字符串,

    例如: 

      string utf8String = utf8.GetString(utf8Bytes);

  为什么使用Encoder及Decoder类?

  在网络传输和文件操作中,如果数据量比较大,需要划分为较小的块,此时可能出现一个数据块的末尾是一个不匹配的高代理项,而与其匹配的低代理项则位于下一个数据块中。对于这种情况,直接使用Encoding类的GetBytes方法编写程序就比较繁琐。此时,可以利用Encoder类轻松地解决这个问题。

  Encoder类 Encoder类位于System.Text名称空间下,利用它可以将一组字符转换为一个字节序列。

  (1)获取Encoder实例:利用GetEncoder方法获取实例

    

    //获取ASCII编码的Encoder实例    Encoder asciiEncoder = Encoding.ASCII.GetEncoder();    //获取Unicode编码的Encoder实例    Encoder unicodeEncoder = Encoding.Unicode.GetEncoder();

  (2)GetBytes方法 GetBytes方法将一组字符编码转换为字节序列。

    参数说明:

    

public virtual int GetBytes(      char[] chars, //要编码的字符数组      int charIndex //第一个要编码的字符的索引      int charCount //要编码的字符的数目      byte[] bytes, //存储编码后的字节序列的字节数组      int byteIndex: //开始目的字节序列的索引位置      bool flush //是否在转换后清除编码器的内部状态    )

  (3)GetByteCount方法 Encoder类提供的GetByteCount方法可计算对字符序列进行编码后所产生的精确字节数,以确定字节数组的长度。

  方法原型:

public abstract int GetByteCount(    char[] chars, //包含要编码的字符集的字符数组    int index, //第一个要编码的字符的索引    int count, //要编码的字符的数目     bool flush //是否在计算后清空内部缓存状态  )

  用Decoder类解码的步骤为:首先通过Encoding的GetDecoder方法创建Decoder实例,然后利用实例的GetChars方法将字节序列解码。

  GetChars方法用于将一个字节序列解码为一组字符,并从指定的索引位置开始存储这组字符。该方法返回向chars写入的实际字符数。

  方法原型:

public abstract int GetChars(    byte[] bytes, //包含要解码的字节序列的字节数组     int byteIndex, //第一个要解码的字节的索引    int byteCount, //要解码的字节数    char[] chars, //包含所产生的字符集的字符数组    int charIndex //写入所目的字节数组的索引位置  )

  

  

转载于:https://www.cnblogs.com/xchit/p/socket_6.html

你可能感兴趣的文章
LeetCode -- Palindrome Linked List
查看>>
栈应用——逆波兰式表达式的值
查看>>
vscode 快速生成html
查看>>
HTML5 全屏化操作功能
查看>>
返本求源——DOM元素的特性与属性
查看>>
4、C#进阶:MD5加密、进程、线程、GDI+、XML、委托
查看>>
部署DLL webservices 若干费脑点
查看>>
zabbix监控报错zabbix server is not running解决方法
查看>>
MyEclips快捷键,多行注释
查看>>
【原】ios打包ipa的四种实用方法(.app转.ipa)
查看>>
python中的nonloca和global
查看>>
JavaScript延时执行函数中对call和apply的应用
查看>>
zookeeper-3.4.5-cdh5.1.0 完全分布式安装
查看>>
1.2输出100以内的素数&输出前100个素数。
查看>>
小白的python之路11/14
查看>>
客户端传入数据的校验-RestController进阶
查看>>
靠查看英语资料 , “一不小心”成了国内第一
查看>>
人月神话 中文版 pdf
查看>>
JavaScript高级程序设计(第3版)中文高清完整pdf
查看>>
Oracle性能优化求生指南pdf
查看>>