第04章-数据流与数据的加密和解密概要

上传人:今*** 文档编号:107464177 上传时间:2019-10-19 格式:PPT 页数:82 大小:817KB
返回 下载 相关 举报
第04章-数据流与数据的加密和解密概要_第1页
第1页 / 共82页
第04章-数据流与数据的加密和解密概要_第2页
第2页 / 共82页
第04章-数据流与数据的加密和解密概要_第3页
第3页 / 共82页
第04章-数据流与数据的加密和解密概要_第4页
第4页 / 共82页
第04章-数据流与数据的加密和解密概要_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《第04章-数据流与数据的加密和解密概要》由会员分享,可在线阅读,更多相关《第04章-数据流与数据的加密和解密概要(82页珍藏版)》请在金锄头文库上搜索。

1、工业和信息化部“十二五”规划教材 普通高等学校“十二五”规划教材 C#网络应用编程第3版 第4章 数据流与数据的加密和解密,2,Ch04 数据流与数据的加密和解密,4.1 数据编码和解码 4.2 数据流 4.3 数据加密与数字签名,4.1 数据编码和解码,4.1.1 常见的字符集编码方式 4.1.2 利用Encoding类实现编码和解码,4,4.1.1 常见的字符集编码方式,每个国家都有自己的字符编码方式 要想正确打开一个文件,必须知道它采用的是哪种编码方式,否则就可能会出现乱码。 常见的字符集编码方式: ASCII Unicode UTF-8 GB2312和GB18030,5,4.1.1 常

2、见的字符集编码方式,1ASCII ASCII字符集由128个字符组成,包括大小写字母、数字09、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)。 2Unicode Unicode是国际通用的编码方式,可以表示地球上绝大部分地区的文字。这种编码每个字符都占2个字节,例如一个英文字符占2个字节,一个汉字也是2个字节。 C#中的字符和字符串默认采用的都是Unicode编码。,6,4.1.1 常见的字符集编码方式,3UTF-8 UTF-8是在因特网上使用最广泛的一种编码格式。它是Unicode的一种变长字符编码,用14个字节表示一个Unicode字符。例如,每个英文字母都占1

3、个字节,每个汉字都占4个字节。 4GB2312和GB18030 对于简体中文来说,国家规定的编码标准(国标)有两种,一种是GB2312(1980年公布),另一种是GB18030(2000年公布) GB2312每个汉字的编码长度都占2个字节,这种编码方式最多支持6千多个汉字的编码; GB18030编码长度为14个字节,可支持两万多个汉字的编码。,7,4.1.2 利用Encoding类实现编码和解码,Encoding类位于System.Text命名空间下 该类主要用于对字符集进行编码和解码以及将一种编码格式转换为另一种编码格式。 Encoding类提供的常用属性和方法:,8,4.1.2 利用Enc

4、oding类实现编码和解码,Encoding类的基本用法: 1获取所有编码名称及其描述信息 2获取指定编码名称及其描述信息 3不同编码之间的转换 4利用Encoding类实现字符串的编码和解码,9,4.1.2 利用Encoding类实现编码和解码,1获取所有编码名称及其描述信息 使用Encoding类静态的GetEncodings方法可得到一个包含所有编码的EncodingInfo类型的数组。 EncodingInfo类同位于System.Text命名空间下,提供有关编码的基本信息。 foreach ( EncodingInfo ei in Encoding.GetEncodings( ) E

5、ncoding en = ei.GetEncoding( ); Console.WriteLine(“编码名称:0,-18,编码描述:1“, ei.Name, en.EncodingName); ,10,4.1.2 利用Encoding类实现编码和解码,2获取指定编码名称及其描述信息 Encoding类提供了UTF8、ASCII、Unicode等属性,通过这些属性可以获取某个字符集编码。 也可以利用Encoding类静态的GetEndcoing方法来获取。 Encoding ascii = Encoding.ASCII; Encoding gb2312 = Encoding.GetEncodi

6、ng(“GB2312“); Encoding gb18030 = Encoding.GetEncoding(“GB18030“); 得到Encoding对象后,即可利用HeaderName属性获取编码名称,利用EncodingName属性获取编码描述。 string s1 = “GB2312的编码名称为:“ + gb2312.HeaderName; string s2 = “GB2312的编码描述为:“ + gb2312.EncodingName;,11,4.1.2 利用Encoding类实现编码和解码,3不同编码之间的转换 利用Encoding类的Convert方法可将字节数组从一种编码转换

7、为另一种编码,转换结果为一个byte类型的数组。 语法为: public static byte Convert( Encoding srcEncoding, /源编码 Encoding dstEncoding, /目标编码 byte bytes /待转换的字节数组 ),12,4.1.2 利用Encoding类实现编码和解码,3不同编码之间的转换 如将Unicode字符串转换为UTF8字符串 string s = “abcd“; Encoding unicode = Encoding.Unicode; Encoding utf8 = Encoding.UTF8; byte b = Encodi

8、ng.Convert(unicode, utf8, unicode.GetBytes(s); string s1 = utf8.GetString(b);,13,4.1.2 利用Encoding类实现编码和解码,4利用Encoding类实现字符串的编码和解码 可以直接用Encoding类实现字符串的编码和解码 例如: Encoding en = Encoding.GetEncoding(“GB2312“); /编码 byte bytes = en.GetBytes(“abcd123“); /按字节显示编码后的数据 textBlock1.Text = BitConverter.ToString(

9、bytes); /解码 textBlock2.Text = en.GetString(bytes);,14,4.1.2 利用Encoding类实现编码和解码,【例4-1】演示Encoding类的基本用法,运行效果如图4-1所示,4.2 数据流,4.2.1 文件流(FileStream) 4.2.2 内存流(MemoryStream) 4.2.3 网络流(NetworkStream) 4.2.4 加密流(CryptoStream) 4.2.5 StreamReader和StreamWriter类 4.2.6 BinaryReader和BinaryWriter类,16,4.2 数据流,数据流(St

10、ream)是对串行传输数据的一种抽象表示 当希望通过网络逐字节串行传输数据,或者对文件逐字节进行操作时,首先需要将数据转化为数据流。 System.IO命名空间下的Stream类是所有数据流的基类。 数据流一般和某个外部数据源相关 数据源可以是硬盘上的文件、外部设备(如I/O卡的端口)、内存、网络套接字等。,17,4.2 数据流,根据不同的数据源,可分别使用从Stream类派生的类对数据流进行操作。 FileStream类、MemoryStream类、NetworkStream类、CryptoStream类 用于文本读写的StreamReader和StreamWriter类 用于二进制读写的B

11、inaryReader和BinaryWriter类等。 对数据流的操作有3种: 逐字节顺序写入(将数据从内存缓冲区传输到外部源) 逐字节顺序读取(将数据从外部源传输到内存缓冲区) 随机读写(从某个位置开始逐字节顺序读或写)。,18,4.2.1 文件流(FileStream),System.IO命名空间下的FileStream类继承于Stream类 利用FileStream类可以对各种类型的文件进行读写 例如:文本文件、可执行文件、图像文件、视频文件等 1创建FileStream对象 常用有两种创建FileStream对象的办法。 (1)利用构造函数创建FileStream对象 (2)利用Fil

12、e类创建FileStream对象,19,4.2.1 文件流(FileStream),(1)利用构造函数创建FileStream对象 利用FileStream类的构造函数创建FileStream对象 语法为 FileStream (string path, FileMode mode, FileAccess access) 参数中的path指定文件路径; mode指定文件操作方式; access控制文件访问权限。 FileMode枚举的可选值:CreateNew、Create、Open、OpenOrCreate、Truncate、Append FileAccess枚举的可选值有:Read、Wri

13、te、ReadWrite,20,4.2.1 文件流(FileStream),(2)利用File类创建FileStream对象 利用System.IO命名空间下的File类创建FileStream对象。 利用OpenRead方法创建仅读取的文件流; 利用OpenWrite方法创建仅写入的文件流。 如,以仅读取的方式打开File1.txt文件。 FileStream fs= File.OpenRead(“D:lsFile1.txt“);,21,4.2.1 文件流(FileStream),2读写文件 得到FileStream对象后: 可以利用该对象的Read方法读取文件数据到字节数组中 利用Writ

14、e方法将字节数组中的数据写入文件 (1)Read方法 FileStream对象的Read方法用于将文件中的数据读到字节数组中 语法如下,该方法返回从FileStream中实际读取的字节数。 public override int Read( byte array, /保存从文件流中实际读取的数据 int offset, / 向array数组中写入数据的起始位置,一般为0 int count /希望从文件流中读取的字节数 ),22,4.2.1 文件流(FileStream),(2)Write方法 FileStream对象的Write方法用于将字节数组写入到文件中 语法如下: public ove

15、rride void Write( byte buffer, /要写入到文件流中的数据 int offset, /从buffer中读取的起始位置 int size /写入到流中的字节数 ) 【例4-2】演示FileStream类的基本用法,23,4.2.2 内存流(MemoryStream),利用System.IO命名空间下的MemoryStream类,可以按内存流的方式对保存在内存中的字节数组进行操作: 利用Write方法将字节数组写入到内存流中 利用Read方法将内存流中的数据读取到字节数组中 MemoryStream的用法与文件流的用法相似,支持对数据流的查找和随机访问。 该对象的Can

16、Seek属性值默认为true 程序中可通过Position属性获取内存流的当前位置。 由于内存流的容量可自动增长,因此在数据加密以及对长度不定的数据进行缓存等场合,使用内存流比较方便。 【例4-3】演示MemoryStream的基本用法,24,4.2.3 网络流(NetworkStream),System.Net.Sockets命名空间下的NetworkStream类也是从Stream类继承而来的,利用它可以通过网络发送或接收数据。 可以将NetworkStream看作在数据源和接收端之间架设了一个数据通道,这样一来,读取和写入数据就可以针对这个通道来进行。 注意NetworkStream类仅支持面向连接的套接字。 对于NetworkStream流,写入操作是指从来源端内存缓冲区到网络上的数据传输;读取操作是从网络上到接收端内存缓冲区(如字节数组)的数据传输。,25,4.2.3 网络流(NetworkStream),一旦构造了NetworkStream对

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号