第十篇:代码案例学习:解析二进制数据格式.pdfVIP

第十篇:代码案例学习:解析二进制数据格式.pdf

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档