【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

二进制文件的操作

原创 2013年12月05日 17:04:15
所有文件的存储其实质都是二进制的,二进制文件往往由两部分组成,
一部分是文件头另一部分存放了文件的内容。

文件头通常存放与文件格式有关的信息,以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罢了。
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

金明的预算方案

Codevs1155 金明的预算方案动态规划#include #include int f[72][32010],m,n,c[72][3],v[62][3]; int main() { ...

Android开发之webview的加载优化

Android客户端中加载HTML页面,会出现HTML内容载入完成,标题也正常显示,但是整个网页需要等近5秒或者更长的时间才会显示出来。 一般情况下WebView加速,优先先用webView.get...

NOIP模拟——subset

分块算法。 1、因为s<2^16,以2^8分块,a[pre] [suf],其中下标pre表示前8位(指的二进制的8位,但是以十进制存,后皆同),suf表示后8位,存的是个数。对于任意数分成前8位(用位...

从今天开始 把我自己所有这几年的Android开发总结一下

从今天开始 把我自己所有这几年的Android开发总结一下,不定时写一些Android的开发经验

推荐几个精致的web UI框架及常用前端UI框架

以下是几个精致的web UI框架 1.Aliceui Aliceui是支付宝的样式解决方案,是一套精选的基于 spm 生态圈的样式模块集合,是 Arale 的子集,也是一套模块化的...

Android ListView中Item点击事件失效解决方案

在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布局和自定义adapter了,一般是继承于BaseAdapter,写Lis...

机房收费软件需求说明书

机房收费软件需求说明书 1引言 1.1编写目的            为了使用户和软件开发者双方对该软件的初始规定有一个共同的理解, 使之成为整个开发工作的基础,有利于对项目的回溯和指导后续的开发和维...

【原创】ARM串口控制台

一、串口基本知识 作用 : ①:数据传输; ②: 当作控制台 通信方式,波特率。一般采用的波特率位115200. 通信参数:一般由起始位,八位数据,奇偶...

fastJson中 JSON.toJSONString(list,true) 和 JSON.toJSONString(list)的区别

这是在网上摘录fastjson的API,为了更明白的解释,看下面的代码。  class="prettyprint" name="code">class="hljs java has-numbering...

Java读写二进制文件操作

/** * 二进制读写文件 */ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; public class MainClass { /** *
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)