- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第⼗章:代码案例学习:解析⼆进制数据格式
第⼗章:代码案例学习:解析⼆进制数据格式
本章将会讨论⼀个常见任务:解析 (parsing )⼆进制⽂件。选这个任务有两个⽬的。
第⼀个确 是想谈谈解析过程,但更重要的⽬标是谈谈程序组织、重构和消除样板代
码 (boilerplate code :通常指不重要,但没它又不⾏的代码)。我们将会展⽰如何清
理冗余代码,并为第⼗四章讨论 Monad 做点准备。
我们将要⽤到的⽂件格式来⾃于 netpbm 库,它包含⼀组⽤来处理位图图像的程序及
⽂件格式,它古⽼⽽令⼈尊敬。这种⽂件格式不但被⼴泛使⽤,⽽且还⾮常简单,虽
然解析过程也不是完全没有挑战。对我们⽽⾔最重要的是,netpbm ⽂件没有经过压
缩。
灰度⽂件
netpbm 的灰度⽂件格式名为 PGM (”portable grey map” )。事 上它不是⼀个格式,
⽽是两个:纯⽂本 (又名P2 )格式使⽤ ASCII 编码,⽽更常⽤的原始 (P5 )格式则采
⽤⼆进制表⽰。
每种⽂件格式都包含头信息,头信息以⼀个“魔法”字符串开始,指出⽂件格式。纯⽂
本格式是 P2 ,原始格式是 P5 。魔法字符串之后是空格,然后是三个数字:宽度、⾼
度、图像的最⼤灰度值。这些数字⽤⼗进制 ASCII 数字表⽰,并⽤空格隔开。
最⼤灰度值之后便是图像数据了。在原始⽂件中,这是⼀串⼆进制值。纯⽂本⽂件
中,这些值是⽤空格隔开的⼗进制 ASCII 数字。
原始⽂件可包含多个图像,⼀个接⼀个,每个都有⾃⼰的头信息。纯⽂本⽂件只包含
⼀个图像。
解析原始 PGM ⽂件
⾸先我们来给原始 PGM ⽂件写解析函数。PGM 解析函数是⼀个纯函数。它不管获取
数据,只管解析。这是⼀种常见的 Haskell 编程⽅法。通过把数据的获取和处理分
开,我们可以很⽅便地控制从哪⾥获取数据。
我们⽤ ByteString 类型来存储灰度数据,因为它⽐较节省空间。由于 PGM ⽂件以
ASCII 字符串开头,⽂件内容又是⼆进制数据,我们同时载⼊两种形式的 ByteString
模块。
-- file: ch10/PNM .hs
import qualified Data.ByteStrin .Lazy .Char8 as L8
import qualified Data.ByteStrin .Lazy as L
import Data.Char (isSpace)
我们并不关⼼ ByteString 类型是惰性的还是严格的,因此我们随便选了惰性的版本。
我们⽤⼀个直⽩的数据类型来表⽰ PGM 图像。
-- file: ch10/PNM .hs
data Greymap = Greymap {
reyWidth :: Int
, reyHei ht :: Int
, reyMax :: Int
, reyData :: L.ByteStrin
} derivin (Eq)
通常来说,Haskell 的 S ow 例会⽣成数据的字符串表⽰,我们还可以⽤ read 读回
来。然⽽,对于⼀个位图图像⽂件来说,这可能会⽣成⼀个⾮常⼤的字符串,⽐如当
你对⼀张照⽚调⽤ s ow 的时候。基于这个原因,我们不准备让编译器⾃动为我们派
⽣ S ow 例;我们会⾃⼰ 现,并刻意简化它。
-- file: ch10/PNM .hs
instance Show Greymap where
show (Greymap w h m _) = Greymap ++ show w ++ x ++ show h
我们的 S ow 例故意没打印位图数据,也就没必要写 Read 例了,因为我们⽆法从
s ow 的结果重构 Greymap 。
解析函数的类型显⽽易见。
-- file: ch10/PNM .hs
parseP5 :: L.ByteStrin - Maybe (Greymap, L.ByteStrin )
这个函数以⼀个 ByteString 为参数,如果解析成功的话,它返回⼀个被解析的
Greymap 值以及解析之后剩下的字符串,剩下的字符串以后会⽤到。
解析函数必须⼀点⼀点处理输⼊数据。⾸先,我们必须确认我们正在处理的是原始
PGM ⽂件;然后,我们处理头信息中的数字;最后我们处理位图数据。下⾯是是⼀
种⽐较初级的 现⽅法,我们会在它的基础上不断改进。
-- file: ch10/P
您可能关注的文档
最近下载
- 河南省许昌市2025年某中学小升初入学分班考试英语考试真题含答案.docx VIP
- 大型泵站工程运行管理实施方案.docx
- ISO45001-2018职业健康安全管理体系之4-2:“4 组织及环境-4.2理解工作人员和其他相关方的需求和期望”解读和应用指导材料(2024A1-雷泽佳).docx VIP
- 医疗信息系统的网络安全数据标注指南.docx
- SH∕T 3543-2017 石油化工建设工程项目施工过程技术文件规定 非正式版.pdf VIP
- 中国专利法详解读书重点笔记.doc VIP
- 2026届高考语文背诵诗词补充:《菩萨蛮·书江西造口壁》.pptx VIP
- 强制性条文执行计划(完整版).doc
- 关于夏天的课件.pptx VIP
- 2025中铁五局集团有限公司笔试参考题库附带答案详解.pdf
文档评论(0)