初级视频编辑室|草蜢非编论坛|初级视编室|草蜢视频编辑|会声会影|威力导演|电子相册

 找回密码
 加入初编室
搜索
查看: 868|回复: 2
打印 上一主题 下一主题

[Director 多媒体爱好者] 用FileIO写二进制文件

[复制链接]

296

主题

1132

帖子

2万

积分

超级版主

Rank: 8Rank: 8

论坛版主精华帖勋章

跳转到指定楼层
楼主
发表于 2014-11-24 21:36:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
onekey onekey
原著:David Pollock
  翻译:DCM

  在前一篇文章里,我们讨论了如何利用FileIO从非文本文件中读取数据的问题,本次我们讨论用FileIO编辑现有文件,例如MP3文件上,或是创建新文件,例如从Director的cast member中输出位图文件。

  编辑MP3文件

  写二进制文件最简单的例子莫过于编辑MP3文件的标签。这总比新建文件要来得简单,你不必去弄清整个文件结构,只需明白歌曲信息是储存在最后128个字节里。

on writeBinaryFile filePath, byteList, fileStartByte, listStartByte, deleteOriginalFile

result = 0
fileObj = new (xtra "fileIO")
if deleteOriginalFile then
-- It's often "cleaner" to remove the existing file
-- though you obviously wouldn't do this when editing
-- an MP3 file
fileObj.openFile (filePath, 0)
fileObj.delete ()
fileObj.createFile (filePath)
end if
fileObj.openFile (filePath, 2)
-- Attempt to open the file with write-only access

if fileObj.status () = 0 then
listLength = byteList.count
if fileStartByte.voidP then fileStartByte = 1
-- Set default positions if none were supplied via
-- the fileStartByte & listStartByte parameters
if listStartByte.voidP then listStartByte = 1

fileObj.setPosition (fileStartByte-1)
-- Set the write position in the file & begin dumping
-- the list contents into the file

repeat with index = listStartByte to listLength
fileObj.writeChar (numToChar (byteList[index]))
end repeat
result = 1
end if

fileObj.closeFile ()
fileObj = 0
return result
end

  各参数意义如下:
  1. filePath:所创建或修改文件的完整路径。
  2. byteList:包含有从0到255的线性列表。对ASCII文本文件而言,将从32到126.ASCII字符值可参考http://www.asciitable.com/。对于其它的二进制值,情况会更复杂一些。现在我们仅需关注文本。
  3. fileStartByte:标示从如处开始写数据(对不存在的文件,函数fileObj.setPosition()会忽略)。
  4. listStartByte:在byteList中如果不是所有的数据都需保存的话, 确定其起始位置 。这极其有用,例如,你仅需对图像数据的某一处进行修改。
  5. delteteOriginalFile:允许替换原有文件。

  例子example mp3_editor.dir演示了如何使用writeBinaryFile,包括其它的一些处理程序,在写mp3文件前,格式化mp3头文件。这提供了一个如何读和写文件片断的极好例子.记住:所有读出或写进的信息依然是以ASCII方本保存在二进制文件末尾,这一点要我们去关心数据类型。

  数据类型

  文件中的数据以不同的形式存在:布尔型、整型、浮点型、文本型等.相对于只能支持整型和浮点型数字数据的Lingo而言,其它大多数语言能支持更多形式的整型和浮点型,下面将要涉及。为了能处理文件中的数据,我们需要知道这些数据的类型,以利于将其转换成Lingo中相应的数据类型。

  观察mp3-editor.dir的代码,注意到getBytevalue 和appendByteDate句柄,用作数据转换。getByteValue句柄将读出的字节型数据转换成Lingo能处理的数值。反过来,appendByteData在保存回原来的文件时将数值转换成字节。目前,只能ASCII、8位、16位、32位无符号型数据能被getByteValue和appendByteData所支持,原因很简单:我仅需这些数据类型。当然通过修改代码,能支持其它类型的数据。

  一些数据类型的定义:
  1. String:ASCII文本,每字符8位(1字节)。
  2. Unsigned integers(8,16,32,64bits):无符号型表明仅为正值,表示范围由位数决定。一个16位整数,介于0到65535(2^16-1)。
  3. Signed integers(8,16,32,64 bits):有符号型表明可正可负。由于无符号型整数由位数决定表示范围,不同的是有符号型整数有一半是负数。这样,16位有符号整数型表示范围从-32768到32767.

  用FileIO保存位图

  bitmap_export.dir是一个从演员表中的位图数据导出文件的例子。我们能决定位图文件的布局。伎巧是确保文件头信息是正确的。这里数据类型的知识可大显身手了,位图格式用到了8位、16位、32位无符号型整数,如同ASCII文本数据一样有着各种自有的属性。

  在转换数据这一部分,在bitmap_export中的exportBitMap句柄上,你可增加支持位图格式的其它特性,使其更复杂。这包括利用调色板创建图象,压缩图象时用长编码,认不同位深保存图象等。

  其它文件格式

  经由FileIO能够探查和保存的文件形式丰富多样,包括声音、位图、数据库、数字影片等你所能拷进硬盘的文件。现在我不敢说没人会在Director 中建立一个QuickTime文件,或去试着重建数据库,但是对于速度不是问题的小任务,便宜的FileIO不在话下。
楼主热帖
河边已是一首歌
回复

使用道具 举报

206

主题

4518

帖子

7万

积分

初编室元帅

Rank: 14Rank: 14Rank: 14Rank: 14

活跃会员帅哥会员百帖纪念荣誉勋章论坛万元户

沙发
发表于 2014-11-24 21:59:58 | 只看该作者
谢谢楼主提供分享!!

131

主题

5807

帖子

11万

积分

初编室元帅

Rank: 14Rank: 14Rank: 14Rank: 14

帅哥会员活跃会员论坛万元户百帖纪念荣誉勋章

板凳
发表于 2015-1-21 11:49:01 | 只看该作者
阳春白雪,逛一逛,看一看,顶一顶。
您需要登录后才可以回帖 登录 | 加入初编室

本版积分规则

手机版|小黑屋|初级视频编辑室

GMT+8, 2024-11-5 12:54 , Processed in 0.070379 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表