上一篇 | 下一篇

用FileIO写二进制文件

发布: 2007-1-25 17:18 | 作者: David Pollock | 来源: 译自director-online.com | 查看: 424次

  原著:David Pollock 奥古多媒体x"u_D1F:L4w~
  翻译:DCM奥古多媒体4_2C(z q a6{ [|
奥古多媒体 t.]%V-Ih ]ic-j
  在前一篇文章里,我们讨论了如何利用FileIO从非文本文件中读取数据的问题,本次我们讨论用FileIO编辑现有文件,例如MP3文件上,或是创建新文件,例如从Director的cast member中输出位图文件。
/OtDf0h%y(t!{ b 奥古多媒体] j8i6K3oE T
  编辑MP3文件
?ap{U%E 奥古多媒体Z `M/w_{g
  写二进制文件最简单的例子莫过于编辑MP3文件的标签。这总比新建文件要来得简单,你不必去弄清整个文件结构,只需明白歌曲信息是储存在最后128个字节里。
FH-a*oBA'X%\ 奥古多媒体 I$~0Rw&E O.V
on writeBinaryFile filePath, byteList, fileStartByte, listStartByte, deleteOriginalFile奥古多媒体PL!iHL(Yw5AVW~

Ki)j~g.xAV result = 0
1Q D7{1S'Z Gc j U fileObj = new (xtra "fileIO")奥古多媒体 I`h)e IH w
if deleteOriginalFile then奥古多媒体G&b!Vf b{&{ jxdU
-- It's often "cleaner" to remove the existing file
_fl+Jg Pu -- though you obviously wouldn't do this when editing奥古多媒体2u6~h"A7q8u0p$?L
-- an MP3 file
*B-TO1Q7k!A"D#QU b fileObj.openFile (filePath, 0)奥古多媒体e0d3IPHty
fileObj.delete ()
H4sA%RK$Ef*q.n.N0C fileObj.createFile (filePath)
r-zc R`-Kx:E_ end if奥古多媒体g&Fh#H.yX,\
fileObj.openFile (filePath, 2)
5@&BK#Q JL9N#{T9l,g -- Attempt to open the file with write-only access
E&bw^vC
Oy OQT if fileObj.status () = 0 then奥古多媒体4Ox|RI&f$B
listLength = byteList.count奥古多媒体1A.vEM(w
if fileStartByte.voidP then fileStartByte = 1 奥古多媒体V"yqN)o%D8s\
-- Set default positions if none were supplied via
-fM#vo/s a -- the fileStartByte & listStartByte parameters奥古多媒体%q p'IZ&I1|}B
if listStartByte.voidP then listStartByte = 1 奥古多媒体7Cy};cmB
奥古多媒体Xm-?$O E2K1[3P#Q(@
fileObj.setPosition (fileStartByte-1)
F4`Z `c3o.q#Bc -- Set the write position in the file & begin dumping奥古多媒体ULw _1@o/Q5Os6W
-- the list contents into the file
MK1qO/\t0[;t
$?3]l3n2^7t,_ repeat with index = listStartByte to listLength
&Ssjx]{ x#{ fileObj.writeChar (numToChar (byteList[index]))
e%CFX:|r end repeat
nkD%E|.V|k result = 1
/`xbuCHU end if 奥古多媒体.k2Z6hN2X7o

M(ZpV{"A fileObj.closeFile ()
_ eO v7al*{up f+] fileObj = 0奥古多媒体4^E{c*_y
return result
L8qL!Pq end奥古多媒体^~Z+A|2S
奥古多媒体'z*l-uT1I&Fp O FJ
  各参数意义如下:
NHF2A&Q.lP l   1. filePath:所创建或修改文件的完整路径。
*\-h0O:T\   2. byteList:包含有从0到255的线性列表。对ASCII文本文件而言,将从32到126.ASCII字符值可参考http://www.asciitable.com/。对于其它的二进制值,情况会更复杂一些。现在我们仅需关注文本。
V Z,}n M~   3. fileStartByte:标示从如处开始写数据(对不存在的文件,函数fileObj.setPosition()会忽略)。
T2j eiUb   4. listStartByte:在byteList中如果不是所有的数据都需保存的话, 确定其起始位置 。这极其有用,例如,你仅需对图像数据的某一处进行修改。
X2n:E3Yw}   5. delteteOriginalFile:允许替换原有文件。奥古多媒体 x7I_XaAg!a}0D
奥古多媒体'D1B%?+u%a
  例子example mp3_editor.dir演示了如何使用writeBinaryFile,包括其它的一些处理程序,在写mp3文件前,格式化mp3头文件。这提供了一个如何读和写文件片断的极好例子.记住:所有读出或写进的信息依然是以ASCII方本保存在二进制文件末尾,这一点要我们去关心数据类型。
#e2n-Y9eB,C%j&u+k~ 奥古多媒体J8S'X_ jX.\8o
  数据类型奥古多媒体3](IGt8Vy,UoZ
奥古多媒体)hy ]4c@+_j
  文件中的数据以不同的形式存在:布尔型、整型、浮点型、文本型等.相对于只能支持整型和浮点型数字数据的Lingo而言,其它大多数语言能支持更多形式的整型和浮点型,下面将要涉及。为了能处理文件中的数据,我们需要知道这些数据的类型,以利于将其转换成Lingo中相应的数据类型。奥古多媒体mq?M(~)m
奥古多媒体Px$B @] \U
  观察mp3-editor.dir的代码,注意到getBytevalue 和appendByteDate句柄,用作数据转换。getByteValue句柄将读出的字节型数据转换成Lingo能处理的数值。反过来,appendByteData在保存回原来的文件时将数值转换成字节。目前,只能ASCII、8位、16位、32位无符号型数据能被getByteValue和appendByteData所支持,原因很简单:我仅需这些数据类型。当然通过修改代码,能支持其它类型的数据。奥古多媒体y7YK+I$h

%m!_'^m%y|Adl   一些数据类型的定义:奥古多媒体rfs1VO}7B^)A
  1. String:ASCII文本,每字符8位(1字节)。
'e2s o!h:B   2. Unsigned integers(8,16,32,64bits):无符号型表明仅为正值,表示范围由位数决定。一个16位整数,介于0到65535(2^16-1)。
N$dSEU t"`   3. Signed integers(8,16,32,64 bits):有符号型表明可正可负。由于无符号型整数由位数决定表示范围,不同的是有符号型整数有一半是负数。这样,16位有符号整数型表示范围从-32768到32767.奥古多媒体qe F*}4U u

E2O)l$O&n)^P   用FileIO保存位图奥古多媒体y1y1B*~tNs

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

Z2p@vx jI4{%rt   在转换数据这一部分,在bitmap_export中的exportBitMap句柄上,你可增加支持位图格式的其它特性,使其更复杂。这包括利用调色板创建图象,压缩图象时用长编码,认不同位深保存图象等。
:S)y5KB i~$|:h 奥古多媒体5Z-o ^u$s)QC+d ~U}
  其它文件格式
|V+u2}?9OW"sQ)K
[ }!j4eSzx   经由FileIO能够探查和保存的文件形式丰富多样,包括声音、位图、数据库、数字影片等你所能拷进硬盘的文件。现在我不敢说没人会在Director 中建立一个QuickTime文件,或去试着重建数据库,但是对于速度不是问题的小任务,便宜的FileIO不在话下。奥古多媒体 OpG6nY;gG Q2OJ

}j:p _-Kc 相关下载

字号: | 推荐给好友

 

评分:0

我来说两句

seccode