六、网络数据编码与解码

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

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

  常用编码: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 //写入所目的字节数组的索引位置

  )

  

  编码/解码DEMO

时间: 2024-08-06 22:31:44

六、网络数据编码与解码的相关文章

CocoaAsyncSocket网络通信使用之数据编码和解码(二)

CocoaAsyncSocket网络通信使用之数据编码和解码(二) 在上一篇CocoaAsyncSocket网络通信使用之tcp连接(一)中,我们已经利用 CocoaAsyncSocket封装了自己的socket connection. 本篇主要是通过引入编码器和解码器,将可以共用的内容模块化. 简述: 在tcp的应用中,都是以二机制字节的形式来对数据做传输. 一般会针对业务协议构造对应的数据结构/数据对象,然后在使用的时候针对协议转换成二进制数据发送给服务端. 但是我们在不同的app中,不同的

c#基于事件模型的UDP通讯框架(适用于网络包编解码)

之前写过一篇关于c#udp分包发送的文章 这篇文章里面介绍的方法是一种实现,可是存在一个缺点就是一个对象序列化后会增大非常多.不利于在网络中的传输. 我们在网络中的传输是须要尽可能的减小传送的数据包的大小.于是我參考了网上一些资料和一些开源的项目(http://www.fishlee.net/)这个上面的那个开源的飞鸽传输的框架. 事实上也就是把要传送的数据依照某种规定放在一个byte数组中,然后接收到后依照对应的格式把数据解析出来,为了减小数据还使用了GZipStream的压缩,之前出的问题就

javascript数据相关处理,序列化反序列化,数据编码与解码

对象序列化简而言之,将对象转为字符串.在数据的传输过程中,经常会使用到对象序列化. javascript中常用的对象序列化:JSON.stringify(); javascript中常用的对象反序列化: JSON.parse(); 注意:JSON.stringify兼容ie8+,ie7以及一下可用 json2.js,对应的资源可网上下载 var a = {"name":"mary","age":"100"} var b = J

Wireshark网络抓包(三)——网络协议

一.ARP协议 ARP(Address Resolution Protocol)地址解析协议,将IP地址解析成MAC地址. IP地址在OSI模型第三层,MAC地址在OSI第二层,彼此不直接通信: 在通过以太网发生IP数据包时,先封装第三层(32位IP地址)和第二层(48位MAC地址)的报头: 但由于发送数据包时只知道目标IP地址,不知道其Mac地址,且不能跨越第二.三层,所以需要使用地址解析协议. ARP工作流程分请求和响应: 在dos窗口内"ping"某个域名抓取到的包: 二.IP协

网络基础之osi模型与TCP模型

ISO/OSI(pen System Internetwork) 根据网络功能划分层次:                物理层:                    二进制比特流传输                    定义了:电气规范,机械规范,过程规范 数据链路层:介质访问,点到点的连接                    1.格式化数据:                    2.物理寻址:用物理地址标识数据的发送者和接受者                    3.错误检测:CRC

python 模块介绍 - Base16, Base32, Base64 数据编码

简介 功能:RFC 3548: Base16, Base32, Base64 数据编码.转换二进制数据为适合明文协议传输的 ASCII 序列.转换8bits 为每个字节包含 6,5 或 4bits 的有效数据,比如 SMTP, URL 的一部分或者 HTTP POST 的一部分.参考:RFC 3548.编码算法不同于 uuencode.类型:标准库相关模块:uu, binhex, uu, quopri Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法.由于 2 的 6 次方

IOS学习笔记 -- 网络编程

一.HTTP协议1.面试题: 聊一下HTTP协议(表达对HTTP协议的看法)* HTTP协议的全称: 超文本传输协议, 定制传输数据的规范(客户端和服务器之间的数据传输规范)* 描述HTTP协议完整的通信过程 2.通信过程1> 请求* 客户端 --> 服务器* 请求的内容a."请求行" : 请求方法\请求资源路径\HTTP协议版本GET /MJServer/login?username=123&pwd=123&method=get&type=JSON

Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案

本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有可能被丢弃:为满足用户对不同应用不同服务质量的要求,就需要网络能根据用户的要求分配和调度资源,对不同的数据流提供不同的服务质量: 1.对实时性强且重要的数据报文优先处理: 2.对于实时性不强的普通数据报文,提供较低的处理优先级,网络拥塞时甚至丢弃. 为了满足上述需求,QoS出现了,定义如下: QoS

OMCS ——卓尔不群的网络语音视频框架

作为.NET平台上的开发人员,要开发出一个像样视频聊天系统或视频会议系统,非常艰难,这不仅仅是因为.NET对多媒体的支持比较有限,还因为网络语音视频这块涉及到了很多专业方面的技术,而.NET在这些方面的沉淀更是稀少.OMCS的出现将使得这一状况完全改观,它把所有底层的.复杂的.繁琐的细节都封装在了内部,提供给您一个易用而又强大的接口. OMCS网络语音视频框架是集成了语音.视频.远程桌面.电子白板等多种媒体于一身的网络多媒体框架,实现了多媒体设备[麦克风.摄像头.桌面.电子白板]的采集.编码.网