操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

用FileIO读取二进制数据(二)

2004-6-7 作者:十年磨一剑 转载自:奥古多媒体 网友评论 0 条 点击进入论坛

在前一篇文章里,我们讨论了如何利用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


 

[下一页]


 

各参数意义如下:

filePath 所创建或修改文件的完整路径。

byteList 包含有从0到255的线性列表。对ASCII文本文件而言,将从32到126.ASCII字符值可参考http://www.asciitable.com/.对于其它的二进制值,情况会更复杂一些。现在我们仅需关注文本。

fileStartByte 标示从如处开始写数据.(对不存在的文件,函数fileObj.setPosition()会忽略.)

listStartByte 在byteList中如果不是所有的数据都需保存的话, 确定其起始位置 。这极其有用,例如,你仅需对图像数据的某一处进行修改.

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所支持,原因简单:我仅需这些数据类型。当然通过修改代码,能支持其它类型的数据。

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 登录邮箱: 密码:
  匿名发表
今日推荐
技术文库(共有 46294 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
移动开发
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail