二进制文件的操作

所有文件的存储其实质都是二进制的,二进制文件往往由两部分组成,
一部分是文件头另一部分存放了文件的内容。

文件头通常存放与文件格式有关的信息,以BMP等图象文件为例,
它们的文件头中存放了是何种图形格式、图象大小、调色板等信息,
要显示图象时先读取文件头以获得文件的详细信息,
然后再按其格式把图象内容显示出来。

用二进制方式可以操作任何的文件,当然至关重要的一点是要清楚了解所操作文件的文件头结构。

VB中二进制文件操作主要应用的方法和函数有:Open,Close,Get,Put等。

Open:在For后面的打开模式要用Binary。

Close:关闭文件。

Get:在指定位置取得文件的内容,如果省略位置则从当前位置读取。

Put:在指定位置写入文件,如果省略位置参数就从当前位置写。

下面结合代码讲解二进制文件的操作。

下述程序完成了将两个文件结合成一个文件以及将这个结合后的文件再拆分成原来的两个文件。文件头的结构是自己定义的,非常简单,共8个字节(也就是两个长整型的长度),前4个字节存放第一个文件的长度,后4个字节存放第二个文件的长度。为了更直观地表达文件的结构,现假设有两个文件,第一个文件长度是100字节,第二个文件是200字节,那么合并后得到的文件应该是308字节。按顺序来看,文件的结构是:

4第一文件的长度

4第二文件的长度

100第一文件的二进制内容

200第二文件的二进制内容

除了文件头的8字节长度是固定的后面的长度都会因文件的不同而变化的。

‘实现文件的合并

Private Sub MergeFile()

Dim strFileName1 As String '第一个文件

Dim strFileName2 As String '第二个文件

Dim strOutput As String '合并后的文件

Dim aryContent() As Byte '用来读取文件的数组,每次读取前要重定义

strFileName1 = "c:\a.bmp"

strFileName2 = "c:\b.bmp"

strOutput = "c:\out.bmp"

'注意下面三个Open语句都是用Binary模式打开的

Open strOutput For Binary As #100

Open strFileName1 For Binary As #1

Open strFileName2 For Binary As #2

Put #100, , LOF(1) '取得第一文件的长度,并把它写入到合并文件的文件头中

Put #100, , LOF(2) '取得第二文件的长度,并写入到合并文件的文件头中

ReDim aryContent(LOF(1) - 1) '重定义数组,为读取文件做准备

Get #1, , aryContent() '取得第一文件的内容到数组

Put #100, , aryContent() '把第一文件的内容写到合并文件中

ReDim aryContent(LOF(2) - 1)

Get #2, , aryContent()

Put #100, , aryContent()

'关闭文件

Close #1

Close #2

Close #100

End Sub

‘实现文件的拆分

Private Sub SplitFile()

Dim strFileName1 As String

Dim strFileName2 As String

Dim strFileSplit As String

Dim aryContent() As Byte

Dim lngLOF(1) As Long '存放从文件头取得的两个文件的长度

strFileName1 = "c:\a2.bmp"

strFileName2 = "c:\b2.bmp"

strFileSplit = "c:\out.bmp"

Open strFileSplit For Binary As #100

Get #100, , lngLOF(0) '取得第一文件的长度

Get #100, , lngLOF(1) '第二文件的长度

Open strFileName1 For Binary As #1

Open strFileName2 For Binary As #2

ReDim aryContent(lngLOF(0)-1) '用第一文件的长度重定义数组,为读取第一文件做准备

Get #100, 9, aryContent() '从第9字节,即文件后面开始读取第一文件的内容

Put #1, , aryContent() '把取得的内容写入到拆分文件中

ReDim aryContent(lngLOF(1)-1)

Get #100, 9 + lngLOF(0) + 1, aryContent() '从第9字节再加上第一文件的长度处开始读取第二文件的内容,这里可以清楚地看到文件头的作用了

Put #2, , aryContent

Close #1

Close #2

Close #100

MsgBox "拆分完成。", vbInformation

文本文件由于没有格式所以它的读写都比较简单和直观,
而用二进制操作文件时其实质就是对文件头的理解,
如果不知道文件头的结构那就无法对文件进行处理了,
知道了文件头所包含的信息后,
对文件的操作其实就是按规则进行Get、Put罢了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】GitHub入门详细讲解

第一:请登录https://windows.github.com/ 下载您需要的安装软件,进行安装。安装后桌面有:GitHub 和 Git Shell 第二: 申请一个帐号https://github.com/signup/free 帐号名字要记得清楚。 其他请参考 http://www.woiweb.net/github…

简易飞机空战小游戏

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #include<windows.h>#define width 30 //屏幕的宽 #define high 40 //屏幕的高 #define EnemyAirportNum 5 //敌机出现的数量 #define MyFly 1 …

kotlin获取属性_Kotlin程序| 属性获取器和设置器方法的示例

kotlin获取属性属性获取器和设置器方法 (Properties Getter and Setter Methods) Variable having a class-level scope, declared inside the class body but outside the functions called property. 具有类级别范围的变量&#xff0c;在类主体内部但在称为属性的函数外部声明…

忘记MySQL密码怎么办?一招教你搞定!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在安装完 MySQL 或者是在使用 MySQL 时&#xff0c;最尴尬的就是忘记密码了&#xff0c;墨菲定律也告诉我们&#xff0c;如果…

vb读出二进制文件,合并两个文件

Dim FileMe() As Byte, File1() As Byte, File2() As Byte Dim Ii As Integer, Ss As String 读入程序自身 Open App.Path & "\" & App.EXEName & ".exe" For Binary As #11 ReDim FileMe(FileLen(App.Path & "\" & App.EXE…

通讯录动态版

#include<stdio.h> #include<stdlib.h> #include<string.h>enum operation {EXIT, //退出ADD, //添加SEARCH, //查找DELETD, //删除AMEND, //修改SHOW //显示 };enum object {X_NAME, //名字X_AGE, //年龄X_TELNUMBER,//电话号码X_ADDRESS //住址 };…

icmp消息类型报告传输_ICMP消息的类型和ICMP消息格式

icmp消息类型报告传输ICMP shares error reporting and devices status by messages. Messages created by ICMP are divided into 2 categories: ICMP通过消息共享错误报告和设备状态。 ICMP创建的消息分为两类&#xff1a; 1) Error Reporting Messages 1)错误报告消息 The…

一文详解「队列」,手撸队列的3种方法!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录至我的 Github《算法图解》系列&#xff1a;https://github.com/vipstone/algorithm前面我们介绍了栈&#xff08…

Oracle11完全卸载方法

一、在oracle11G以前卸载oracle会存在卸载不干净&#xff0c;导致再次安装失败的情况&#xff0c;在运行services.msc打开服务&#xff0c;停止Oracle的所有服务。二、 oracle11G自带一个卸载批处理\app\Administrator\product\11.2.0\dbhome_1\deinstall\deinstall.bat运行该批…

斐波拉切数列

问题陈述&#xff1a; Fibonacci为1200年代的欧洲数学家&#xff0c;在他的著作中曾经提到&#xff1a;若有一只兔子每个月生一只小兔子&#xff0c;一个月后小兔子也开始生产。起始只有一只兔子&#xff0c;一个月后就有两只兔子&#xff0c;二个月后有三只兔子&#xff0c;三…

自定义设置一个屏保程序

用C语言写一个简单的窗口程序&#xff0c;目的是生成一个可视化的图形窗口&#xff0c;需要用到EasyX库&#xff0c;可在文章末尾的网盘链接中下载。该程序退出需左击鼠标&#xff0c;否则无法退出。 #include<stdio.h> #include<stdlib.h> #include<windows.h…

JavaScript中带示例的字符串search()方法

字符串search()方法 (String search() Method) search() is method is a String method, it is used to check whether a substring exists in the given string or not. It returns the starting index of the substring from the string where substring exists. If substrin…

漫画:如何找到链表的倒数第n个结点?

————— 第二天 —————什么意思呢&#xff1f;我们以下面这个链表为例&#xff1a;给定链表的头结点&#xff0c;但并不知道链表的实际长度&#xff0c;要求我们找到链表的倒数第n个结点。假设n3&#xff0c;那么要寻找的结点就是元素1&#xff1a;如何利用队列呢&…

转:开源图形库 c语言-图形图像库 集合

Google三维API O3DO3D 是一个开源的 Web API 用来在浏览器上创建界面丰富的交互式的 3D 应用程序。这是一种基于网页的可控3D标准。此格式期望真正的基于浏览器&#xff0c;独立于操作系统之外&#xff0c;并且支持主流的3D显卡&#xff0c;这样就可以在网页中实现效果逼真的3D…

cacti添加I/O监控

首先下载snmpdiskio-0.9.6.zip,文件不好找&#xff0c;我已经放在本文章的附件里面。解压snmpdiskio-0.9.6.zip复制partition.xml到cacti/resource/snmp_queries/下面[roottest]# cp partition.xml /home/wwwroot/default/cacti/resource/snmp_queries/分别导入模板文件&#x…

数组中的reverse_数组reverse()方法以及JavaScript中的示例

数组中的reverseJavaScript reverse()方法 (JavaScript reverse() method) reverse() method is used to reverse the order of the elements in an array, it changes the actual array and also returns an array with reversed elements. reverse()方法用于反转数组中元素的…

磊哥私藏书单分享,160买400的书!

程序员的节日&#xff08;10.24&#xff09;到了&#xff0c;当当的活动也搞起来了&#xff0c;作为有上进心的你&#xff0c;怎么可能停止学习和进步呢&#xff1f;所以磊哥在当当满 400 元减 200 元的基础上&#xff0c;有要了一个减 40 的劵&#xff0c;也就是只需要花 160 …

ORACLE中使用递归查询

在数据库查询中常常会碰到要查询树形结构的数据&#xff0c;需要用一个字段的数据当做下一条记录的父节点继续查询&#xff0c;如果在不知道有多少级节点的情况下一次次手写SQL查询会很繁琐而没有效率&#xff0c;这时可以使用 oracle中的connect with prior递归算法&#xff1…

linux——回射服务器

回射服务器即客户端发送一段数据给服务器&#xff0c;服务器再将这段数据原封不动的发送给客户端&#xff0c;原理很简单&#xff0c;原理图如下&#xff1a; 以TCP协议为例&#xff0c;客户端、服务器代码如下&#xff1a; ** 服务器&#xff1a; ** #include <stdio.h…

Android 5.0 API 的变化——开发人员注意

Android 5.0 API变化译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html —— By NashLegendSample示例在这里找&#xff1a;https://github.com/googlesamples/原译文在我的github上&#xff1a;https://github.com/NashLegend/ProjectBabel/blob…