本帖最后由 大灰狼1976 于 2024-6-8 12:47 编辑
VBA处理二进制数据文件的实现方法及部分用途
前言 此贴内容和一般办公应用没有关系,仅为自己的兴趣而记录,当然也供其他感兴趣者参考。 【搬运说明】此贴原发布在其他论坛,最近该论坛经常崩,为了防止最坏的结果,故逐渐搬运至此。
用途 修改软件及其他数据文件,以达到某种预期目的,例如软件汉化、更换素材等。高阶者可以用来修改软件的功能、去除一些使用限制。 我一般只是用来做软件汉化(不仅限于PC软件汉化)。
基本功能介绍 非常幸运,VBA可以如同处理文本文件一样方便地读写二进制数据文件,而不需要借助API或其他专用插件来实现,甚至可以凭空创建一个二进制数据文件。 所涉及的VBA语句也很简单,说明如下: 1、提取二进制文件数据: Dim arrByte() AsByte, fNo#, n As Byte fNo = FreeFile Open FileFullPath For Binary As fNo '打开二进制数据源文件 ReDim arrByte(LOF(fNo) - 1) '将接收用的数组大小设置成匹配源文件字节数 Get fNo, ,arrByte '用字节数组接收二进制数据 Close fNo '关闭二进制数据源文件
上述语句执行后,可以将一个二进制文件的数据全盘返回给一个同样大小的字节数组,通过修改一些参数,也可以截取一个字节或一段字节返回给数组,如: ReDim arrByte(99) '如果想截取100个字节出来,需要先调整数组大小 Get fNo, 100 ,arrByte '从第100个字节开始截取,返回给数组 Get fNo, 100 ,n '截取第100个字节返回给一个字节变量n
通过上面示例中的方法,我们可以方便地获取二进制文件中的全部数据、任意位置的部分数据、任意位置的一个字节数据,灵活性还是相当高的,操作也简单。
2、写入二进制文件数据: 写入二进制数据和读取的语句大同小异,基本上只需要将Get改成Put即可 Dim arrByte() AsByte, fNo#, n As Byte fNo = FreeFile Open FileFullPath For Binary As fNo '打开二进制数据源文件 Put fNo, ,arrByte '假设arrByte内已准备好数据 Close fNo '关闭二进制数据源文件 上述语句执行后,可以将一个字节数组的数据全部写入二进制数据文件内,如果二进制数据区域比数组大,则只覆盖数组大小的区域;反之,数组数据仍然会全部写入二进制数据文件,二进制数据文件也会相应增大。
通过修改一些参数,也可以写入一个字节或一段字节给二进制数据文件: Put fNo, 100 ,arrByte '从第100个字节开始写入整个数组内的数据 Put fNo, 100 ,n '在第100个字节处写入变量n的值。 注意:上述Put语句都是数据覆盖而非数据插入。
如果要凭空创建一个二进制数据文件,直接使用上述Open语句会出错,可以用以下两种预处理方法: 1、手工创建一个目标文件,就是生成一个空TXT文档,然后随意改下扩展名就行; 2、使用FileSystemObject来创建一个目标文件,也是空的。 然后再使用上述Open等一系列语句来写入内容。
本楼示例: 1、提取一个BMP图片的二进制数据,写入单元格区域; 2、对图片进行几个简单修改以及还原处理。
以下各楼会贴出一些实际应用,但这些示例的准备都需要时间,所以不定时更新,未完待续...... 注意:对二进制数据的修改有可能会触发某些杀软或防火墙的异常行为侦测,所以尽量不要在公司里面尝试,我今天就触发了一次,好孩子不要学我。
|