如何设计二进制文件格式

前言

本文是由于需要设计一种二进制的文件格式用于保存前文中所提取出来的wav文件的采样数据故而写下本篇文章。

1、为何需要一种二进制的文件格式

程序时常需要保存自身的文档数据。比如一个矢量绘图程序,需要将用户绘制的每个图元都保存到文件中,以后再次打开。应该优先考虑文本格式,文本格式容易测试和编辑。更应该优先考虑通用的文本格式,比如 XML, JSON, Lua 等等。这些通用的文本格式已经存在大量的工具和库,可以省下很多功夫。

文本格式读取慢,并且文件尺寸也比较大(就算经过 zip 压缩),大多数情况下这都不是什么问题。但一些场合,要求更快读取速度,更小文件尺寸,这时就需要自己来设计一种二进制文件格式。游戏中的模型数据,就要求读取速度快;而经常通过网络传输的文件,就要求减少文件尺寸,比如 swf 格式。

2、文件格式的具体设计

具体的二进制文件格式,要根据具体的程序需求来设计。但有些设计思路,是所有二进制格式都通用的。了解这些,对将来分析其它的二进制格式也会有帮助。

(1)整体的文件结构

常见二进制文件格式,时常采用 文件头 + 分区 的结构:
file header
section 0
section 1
section 2
section 3

section N

1)文件头(file header ):描述了文件的整体信息,常见的字段有魔数、版本号、检验码、文件大小等等。文件头根据文件的具体用途会有额外的字段,比如一张图片,文件头当中就可以含有表示图片尺寸的字段。

2)分区(section):其结构通常是标签+长度+分区数据
tag + length
section data
tag 和 length 合起来是分区头部,后面紧跟着分区的具体数据。

tag:可以是一个整数,也可以是一个字符串。tag 用来标识分区,不同的 tag 表示不同的分区种类,不同的分区种类有各自不同的读取方式。
比如:
#define kPicShapeTag 1
#define kPreivewTag 2
当 tag 为 1 时,就表示是这个分区存放的是图元数据,当为 2 是表示这个分区存放一张预览图。

length:length 是个整数,表示分区数据的具体长度(不包括分区头部)或者

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用InputStream和OutputStream类来读写二进制文件。InputStream用于读取二进制数据,而OutputStream用于写入二进制数据。下面是一个简单的示例代码,展示了如何使用InputStream和OutputStream读写二进制文件: ```java import java.io.*; public class BinaryFileReadWrite { public static void main(String[] args) { String filePath = "example.bin"; try { // 创建二进制文件并写入数据 OutputStream outputStream = new FileOutputStream(filePath); byte[] data = {1, 2, 3, 4, 5}; outputStream.write(data); outputStream.close(); // 读取二进制文件 InputStream inputStream = new FileInputStream(filePath); byte[] buffer = new byte[1024]; int bytesRead = inputStream.read(buffer); while (bytesRead != -1) { // 处理读取到的数据 for (int i = 0; i < bytesRead; i++) { System.out.print(buffer[i] + " "); } bytesRead = inputStream.read(buffer); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的示例代码中,我们首先使用OutputStream来创建一个名为"example.bin"的二进制文件,并写入一些数据。然后,我们使用InputStream来读取该文件中的数据,并将其打印到控制台上。注意,我们使用了一个字节数组作为缓冲区,每次读取最多1024个字节,并且在读取完整个文件之后,需要关闭InputStream对象。 当然,这只是一个简单的示例,实际的二进制文件读写可能涉及到更复杂的数据结构和算法,需要根据具体情况进行设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值