02_第二章、字节集

上传人:m**** 文档编号:564517831 上传时间:2023-10-14 格式:DOC 页数:47 大小:369.50KB
返回 下载 相关 举报
02_第二章、字节集_第1页
第1页 / 共47页
02_第二章、字节集_第2页
第2页 / 共47页
02_第二章、字节集_第3页
第3页 / 共47页
02_第二章、字节集_第4页
第4页 / 共47页
02_第二章、字节集_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《02_第二章、字节集》由会员分享,可在线阅读,更多相关《02_第二章、字节集(47页珍藏版)》请在金锄头文库上搜索。

1、第二章、字节集字节集是易语言独有的基本数据类型,按字面的意思来理解,所谓“字节集”就是“字节的集合”,其本质就是字节数组。从计算机基础知识中,我们知道,一个字节就是8位(bit),也就是8个“0”或“1”。计算机中所有的东西(指令和数据)都是用0和1表示的,而以字节作为保存数据的最小单位,所以,字节集可以保存任何的数据数字、文本、声音、图像、可执行文件等等;反过来,一段字节集数据具体表示什么,关键看你是如何解读它你可以认为它是一段文本、一张图片或是一首mp3中的一段。易语言的核心支持库提供了很多字节集相关的函数(2-a),这些函数使得我们对字节集的处理异常方便。我们先来看看易语言本身对这些函数

2、的简要介绍。字节集操作命令简要说明取字节集长度取字节集型数据的长度。到字节集将指定数据转换为字节集后返回转换结果。取字节集数据取出字节集中指定位置指定数据类型的数据。取字节集左边返回一个字节集,其中包含指定字节集中从左边算起指定数量的字节。取字节集右边返回一个字节集,其中包含指定字节集中从右边算起指定数量的字节。取字节集中间返回一个字节集,其中包含指定字节集中从指定位置算起指定数量的字节。寻找字节集返回一字节集在另一字节集中最先出现的位置,位置值从 1 开始。如果未找到,返回 -1。倒找字节集返回一字节集在另一字节集中最后出现的位置,位置值从 1 开始。如果未找到,返回 -1。字节集替换将指定

3、字节集的某一部分用其它的字节集替换,然后返回替换后的结果。子字节集替换返回一个字节集,该字节集中指定的子字节集已被替换成另一子字节集,并且替换发生的次数也是被指定的。取空白字节集返回具有特定数目 0 字节的字节集。取重复字节集返回一个字节集,其中包含指定次数的字节集重复结果。分割字节集将指定字节集进行分割,返回分割后的一维字节集数组。指针到字节集返回指定内存指针所指向地址处的一段数据,注意调用本命令前一定要确保所提供的内存地址段真实有效。本命令的最佳使用场合就是在易语言回调子程序和易语言DLL公开子程序用作获取外部数据。这些函数的使用都很简单,但有些函数依然会使人迷惑,或者想更深入地了解其中的

4、相关细节。所以我们先围绕某些函数作一点深入的讨论。2.1 深入讨论字节集相关函数2.1.1 取字节集长度首先我们来研究一下“取字节集长度”函数是如何取得一个字节集长度的,因为它的效率决定了我们是否适合把它放在循环体中执行。系统要计算一段字节集的长度,不外乎有两个方法: 逐一累计,也就是把字节一个一个地数出来。 把字节集的长度存放在某个特殊的地方,需要的时候读取出来,在字节集操作的过程中即时更新该长度数据。系统具体采用的是哪一种方法,我们作一个简单的测验便知。新建一个易语言程序,在窗体上放一个按钮,为该按钮写如下代码:.版本 2.子程序 _按钮测试计算方式_被单击.局部变量 数据, 字节集.局部

5、变量 上次时间数据 取空白字节集 (1) 字节集的长度不论是1还是1000000,计算的时间不变上次时间 取启动时间 ().计次循环首 (1000000, ) 取字节集长度 (数据).计次循环尾 ()输出调试文本 (取启动时间 () 上次时间)这段代码先分配一定长度的字节集数据,然后执行“取字节集长度”函数一百万次,我的机器测得所花的时间是31毫秒左右。如果你的机器速度很快,测得的时间是0毫秒,请将循环次数增加。然后我把字节集数据的长度改为1000000,再次运行该程序,测得的结果依然大约是31毫秒。由此可见,易语言的“取字节集长度”函数并不是蠢蠢地一个一个字节字节地数,而是把字节集的长度存放

6、在了某个特殊的地方,需要的时候就把它读出来。那么具体存放在何处呢? 这也有几种可能: 存放在字节集的开始处。 存放在字节集的末尾处。 存放在字节集开始处更前面的位置。 存放在内存堆栈中的某个表中,然后与指定的字节集变量建立联系。很显然,存放在字节集末尾的可能性很小,不然系统如何知道一段字节集到何处结束?而如果存放在内存中的表中,需要进行额外的查表操作,显得过于烦琐,我们先来测试简单的,这也需要做试验。首先我们需要获得字节集数据的内存地址,这个我们可以通过“取变量地址”函数获得就像第一章中“自定义数据类型的内存存储”一节中那样,如果不太清楚,请先转回去看那一节。不过字节集的变量地址更简单我们只用

7、取字节集的第一个元素的地址就得到了,不用转来转去那么麻烦。得到地址之后,我们就看该地址的第一个整数型数据是否是字节集的长度,如果不是,那显然没有把长度信息放在开头;如果不在开头,我们再把地址指针向内存的低地址方向移动一个整数长度,也就是4个字节,我猜想长度信息也有可能存放在那里。具体的试验代码如下:.版本 2.支持库 spec.子程序 _按钮存储位置_被单击.局部变量 数据, 字节集.局部变量 地址, 整数型.局部变量 临时地址, 整数型.局部变量 临时字节集, 字节集.局部变量 长度, 整数型数据 到字节集 (“abcdefg”) 长度7,你可以更改此字符串,观察其他长度地址 取变量地址 (

8、数据 1) 获得字节集数据的内存地址输出调试文本 (指针到文本 (地址) 此处输出正确的字符串,证明地址是正确的临时字节集 指针到字节集 (地址, 4)长度 取字节集数据 (临时字节集, #整数型, )输出调试文本 (长度) 此处输出错误的结果。地址 地址 4 将内存指针回退一个整数型的数据长度,也就是4个字节临时字节集 指针到字节集 (地址, 4)长度 取字节集数据 (临时字节集, #整数型, )输出调试文本 (长度) 此处输出正确的字节集长度7 由此可见,字节集的长度存在该字节的首地址前面的一个整数中。试验的结果再一次证实了我的猜想。知道了易语言取字节集长度的核心方式,我们就可以大胆地在循

9、环中使用“取字节集长度”函数而不用担心影响效率了,同时也深入地理解了字节集的存储方式。2.1.2 取字节集数据前面我们已经说过,字节集中保存的是什么数据,关键看我们如何转译它。因此我们可以从一个“文本”字节集中读取整数型数据,也可以从一个“整数型”字节集中读取日期时间型数据,也可以在文本和字节集类型中方便地相互转换。此外,系统还提供其他的诸如“到文本”、“到数值”函数,但到底何时采用哪个函数,这是一个问题。我的建议是对字节集数据不要使用“到数值”函数,应该使用“取字节集数据”函数,根据需要传递#整数型、#字节型、#小数型等参数。否则你会发现程序运行的结果不对头,但即使是拿了放大镜也看不出源代码

10、问题在哪里,请看下面的代码片断,输出结果是什么:.版本 2.子程序 _按钮字节集到数值_被单击.局部变量 某字节集, 字节集某字节集 到字节集 (1234)输出调试文本 (到数值 (某字节集)某字节集 到字节集 (“1234”)输出调试文本 (到数值 (某字节集)也许你觉得至少有一个要输出1234吧,但很不幸,输出结果却都是0。但使用“输出调试文本(取字节集数据(某字节集,#整数型,)”可以得到可预见的正确数据。其次是关于“到文本()”和“取字节集数据(.,#文本型,)”的区别问题。对于字节集参数来说,“到文本()”相当于“取字节集数据(.,#文本型,1)”,显然,“取字节集数据()”功能要强

11、大些,可以取指定位置的文本数据。我们知道,在易语言中,文本变量是以0作为文本的结尾的,而一段字节集中可能有多个0分割的文本,“到文本()”函数只能取出第一个文本。请看示例代码:.版本 2.子程序 _按钮字节集到文本_被单击.局部变量 某字节集, 字节集某字节集 到字节集 (“abcdefghijklmnopq”)输出调试文本 (到文本 (某字节集) 输出全部某字节集 8 0 插入一个输出调试文本 (到文本 (某字节集) 文本被截断,只输出abcdefg输出调试文本 (取字节集数据 (某字节集, #文本型, 1) 与上一行输出结果相同输出调试文本 (取字节集数据 (某字节集, #文本型, 9)

12、输出后一半,ijklmnopq由代码的运行结果可以看出,“取字节集数据(.,#文本型,)”很灵活,可以任意指定从指定位置开始的文本,直到遇到结束。此外,“取字节集数据”函数还允许我们像读取文件那样按顺序读取一段数据,请看易语言集成开发环境中对“取字节集数据”函数第三个参数的描述:“参数的名称为“起始索引位置”,类型为“整数型(int)”,可以被省略。指定从字节集的什么地方开始取数据,索引值从1开始。如果被省略,默认为数值1。如果为本参数提供一个整数型变量,则命令执行后将自动修改该变量内容,将其索引值移动到下一个读入位置。如果移动后到达字节集的末尾,将修改该变量的内容为-1。”具体的使用代码如下

13、:.版本 2.子程序 _按钮顺序读取_被单击.局部变量 某字节集, 字节集.局部变量 指针位置, 整数型某字节集 到字节集 (“http:/”) 0 注意文本后面添加一个表示文本结束某字节集 某字节集 到字节集 (12345)某字节集 某字节集 到字节集 (2003年10月1日)指针位置 1输出调试文本 (取字节集数据 (某字节集, #文本型, 指针位置) 输出 http:/输出调试文本 (取字节集数据 (某字节集, #整数型, 指针位置) 输出 12345输出调试文本 (取字节集数据 (某字节集, #日期时间型, 指针位置) 输出 2003年10月1日输出调试文本 (指针位置) 输出 -1

14、,表示到字节集尾。2.1.3 指针到字节集易语言自身对此函数的附加说明是这样的:“本命令的最佳使用场合就是在易语言回调子程序和易语言DLL公开子程序用作获取外部数据。”,其实“指针到字节集”函数的实质是读取本进程内指定内存位置的指定长度的数据,因此,我们可以使用此函数遍历本进程的所有内存空间,当然,这需要你对Windows的内存管理机制有足够的了解才行。因为还没有涉及到回调函数和DLL编程,这里我们以一个小例子来试验一下“指针到字节集”的神奇之处。Windows在执行一个可执行文件的时候,首先会把该文件映射到该进程内存的0x400000地址处,这是一个十六进制的地址,转换成十进制是4194304,我们就从该地址读取10KB的数据看看是什么,具体代码如下:.版本 2.子程序 _按钮从内存读取本执行文件映像_被单击.局部变量 某字节集, 字节集某字节集 指针到字节集 (4194304, 10 1024) 从4194304处读取10KB的数据。写到文件 (“c:asdf.dat”, 某字节集) 将该数据写到一个临时文件中运行 (“notepad.exe c:asdf.dat”, 假, ) 用记事本打开查看删除文件 (“c:asdf.dat”)运行结果如图2.1.3-a所示:图2.1.3-a 指针到字节集试验运行结果如果你是一位有心人,你就

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

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