上一篇 | 下一篇

用FileIO写二进制文件

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

  原著:David Pollock
0Rt#r(CQr?4X,?   翻译:DCM
IN\&NX1n fY(r7P
DRN&y KRBq$`G   在前一篇文章里,我们讨论了如何利用FileIO从非文本文件中读取数据的问题,本次我们讨论用FileIO编辑现有文件,例如MP3文件上,或是创建新文件,例如从Director的cast member中输出位图文件。
?"O0n-qxk5jG"B$B
V~8W~~Pg   编辑MP3文件奥古多媒体2ZY pO ~

!];GLI&a!R'J1v   写二进制文件最简单的例子莫过于编辑MP3文件的标签。这总比新建文件要来得简单,你不必去弄清整个文件结构,只需明白歌曲信息是储存在最后128个字节里。
qm}%Ms3Z1Axj7b 奥古多媒体 v HpfW^3N
on writeBinaryFile filePath, byteList, fileStartByte, listStartByte, deleteOriginalFile奥古多媒体~1}'r1y'E@1W-{

/~4g[)m l2ul` result = 0
q)qs ?TO7J+V? fileObj = new (xtra "fileIO")
2g[@&R6eQ$G+uk if deleteOriginalFile then
vk1w:sh+D!q{ -- It's often "cleaner" to remove the existing file奥古多媒体C^GR7I'J\ZJ
-- though you obviously wouldn't do this when editing
C{D"d N&qf -- an MP3 file
]3U0b9r"KC'hPc fileObj.openFile (filePath, 0)奥古多媒体Mc,Rt)f v9P
fileObj.delete ()
sb9zQwy fileObj.createFile (filePath)
;s*~bW5c end if奥古多媒体-_*}K wgb{6x0hf#P
fileObj.openFile (filePath, 2)
7K5H_-XX_"UO5T0h -- Attempt to open the file with write-only access 奥古多媒体 ^zy$a@
奥古多媒体p0Q)p:c@5W
if fileObj.status () = 0 then
r6zy} G listLength = byteList.count
lW;q:H`(I| if fileStartByte.voidP then fileStartByte = 1 奥古多媒体(F]bHb"mp_t P^
-- Set default positions if none were supplied via
S5I.|/T:?y -- the fileStartByte & listStartByte parameters
zoaz'~tkrB L if listStartByte.voidP then listStartByte = 1 奥古多媒体#k+y&d;YsEc
奥古多媒体3\'~#kYT
fileObj.setPosition (fileStartByte-1)
:S![5n*O Q5V \9n -- Set the write position in the file & begin dumping奥古多媒体%J!}?2{_
-- the list contents into the file奥古多媒体-w;H Q6e_PT
奥古多媒体4Hq&?m^\i
repeat with index = listStartByte to listLength奥古多媒体Q5w8O _,si@a(V3S?
fileObj.writeChar (numToChar (byteList[index]))
+~#S-V%G8B#K] end repeat
g8Xz|zQH)E R w9y result = 1
qo-H| Z:v2^ S7wB end if 奥古多媒体\z[L!m}+` u
奥古多媒体4yl^?+Zm3o5\m
fileObj.closeFile ()
N3p!r+a0f~9bEb4X fileObj = 0
R.yP%X;[){| return result
q^:[P"c}D1}'d:w end奥古多媒体&`Ab`4I @3q&o|

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

2Z:fOm T8XI&GA   例子example mp3_editor.dir演示了如何使用writeBinaryFile,包括其它的一些处理程序,在写mp3文件前,格式化mp3头文件。这提供了一个如何读和写文件片断的极好例子.记住:所有读出或写进的信息依然是以ASCII方本保存在二进制文件末尾,这一点要我们去关心数据类型。奥古多媒体b`+Yf*sgg
奥古多媒体Se,v)n%q&A Q'V
  数据类型奥古多媒体DRMW{(z(D

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

t#O D s%GjR+R_   观察mp3-editor.dir的代码,注意到getBytevalue 和appendByteDate句柄,用作数据转换。getByteValue句柄将读出的字节型数据转换成Lingo能处理的数值。反过来,appendByteData在保存回原来的文件时将数值转换成字节。目前,只能ASCII、8位、16位、32位无符号型数据能被getByteValue和appendByteData所支持,原因很简单:我仅需这些数据类型。当然通过修改代码,能支持其它类型的数据。奥古多媒体^#{0O1}6~3i n#W0W

W,rrO9W7^   一些数据类型的定义:奥古多媒体z&v(_Df0C1T
  1. String:ASCII文本,每字符8位(1字节)。奥古多媒体V9hExDLV
  2. Unsigned integers(8,16,32,64bits):无符号型表明仅为正值,表示范围由位数决定。一个16位整数,介于0到65535(2^16-1)。奥古多媒体;q^9~@|5Du2l
  3. Signed integers(8,16,32,64 bits):有符号型表明可正可负。由于无符号型整数由位数决定表示范围,不同的是有符号型整数有一半是负数。这样,16位有符号整数型表示范围从-32768到32767.
e*oY*U-Jy9\'HX 奥古多媒体4}(K4Ui'q`t
  用FileIO保存位图奥古多媒体.Mo&Y\/Os+{6E

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

m C*{R&p.~?   在转换数据这一部分,在bitmap_export中的exportBitMap句柄上,你可增加支持位图格式的其它特性,使其更复杂。这包括利用调色板创建图象,压缩图象时用长编码,认不同位深保存图象等。
X F? C![e
#SQ`N]   其它文件格式
e8]T.j a|k 奥古多媒体7t(t E4W1Do
  经由FileIO能够探查和保存的文件形式丰富多样,包括声音、位图、数据库、数字影片等你所能拷进硬盘的文件。现在我不敢说没人会在Director 中建立一个QuickTime文件,或去试着重建数据库,但是对于速度不是问题的小任务,便宜的FileIO不在话下。
(`d1c+[:E+Gs 奥古多媒体u j&y:m|.k
相关下载

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


音乐
落叶 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 如果爱能早些说出来
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 为你而活 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 火花 下雨天 小酒窝 樱花草 为你写诗 无可取代 无情的温柔 寂寞才说爱 忘不掉的伤 爱上你是个错 陪你一起看草原 地球人都知道我爱你
城府 假如 花海 兰亭序 爱太痛 舍不得 你若成风 女人如烟 外滩十八号 我们的纪念 摇滚怎么了 和寂寞说分手 爱上你是我的错 爱情里没有谁对谁错