您好,欢迎访问三七文档
RARversion3.40-Technicalinformation技术信息~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~THEARCHIVEFORMATDESCRIBEDBELOWISONLYVALIDFORVERSIONSSINCE1.50下面文档管理器格式的描述仅仅是对1.5以后的版本是有用的==========================================================================RARarchivefileformatRAR文档管理器格式==========================================================================Archivefileconsistsofvariablelengthblocks.Theorderoftheseblocksmayvary,butthefirstblockmustbeamarkerblockfollowedbyanarchiveheaderblock.归档文件是由可变长度的块组成,但是跟随在归档头块的第一个块一定要是一个标志块Eachblockbeginswiththefollowingfields:每一个块是由一下部分组成HEAD_CRC2bytesCRCoftotalblockorblockpartCRC的总块或者局部块HEAD_TYPE1byteBlocktype块类型HEAD_FLAGS2bytesBlockflags块标志HEAD_SIZE2bytesBlocksize块大小ADD_SIZE4bytesOptionalfield-addedblocksize可选的区域,添加的块大小FieldADD_SIZEpresentonlyif(HEAD_FLAGS&0x8000)!=0区域ADD_SIZE只有在head_flags&0x8000不等于0的时候才会被提出TotalblocksizeisHEAD_SIZEif(HEAD_FLAGS&0x8000)==0andHEAD_SIZE+ADD_SIZEifthefieldADD_SIZEispresent-when(HEAD_FLAGS&0x8000)!=0.总块大小就是Head_size,如果add_size被提出的话那么就是head_size+add_size,这些都是在head_flags==0的情况下IneachblockthefollowingsbitsinHEAD_FLAGShavethesamemeaning:每一个块都有几个位来标志head_flags,他有这样的意思0x4000-ifset,olderRARversionswillignoretheblockandremoveitwhenthearchiveisupdated.ifclear,theblockiscopiedtothenewarchivefilewhenthearchiveisupdated;如果设定,老版本的rar会在更新的忽略这个块,并且移除它。如果清除,当更新的时候,块会被复制到新的归档文件中0x8000-ifset,ADD_SIZEfieldispresentandthefullblocksizeisHEAD_SIZE+ADD_SIZE.如果设定,add_size区域会被提出,并且总块大小被设定为head_size+add_sizeDeclaredblocktypes:声明块类型HEAD_TYPE=0x72markerblock标志块HEAD_TYPE=0x73archiveheader归档头部HEAD_TYPE=0x74fileheader文件头部HEAD_TYPE=0x75oldstylecommentheader老风格的头内容HEAD_TYPE=0x76oldstyleauthenticityinformation老风格的授权信息HEAD_TYPE=0x77oldstylesubblock老风格的子块HEAD_TYPE=0x78oldstylerecoveryrecord老风格的恢复记录HEAD_TYPE=0x79oldstyleauthenticityinformation老风格的授权信息HEAD_TYPE=0x7asubblock子块Commentblockisactuallyusedonlywithinotherblocksanddoesn'texistseparately.块内容不能独立的存在,要依靠其他块使用Archiveprocessingismadeinthefollowingmanner:归档过程遵守以下的风格1.Readandcheckmarkerblock读和检查标志块2.Readarchiveheader读归档头部3.ReadorskipHEAD_SIZE-sizeof(MAIN_HEAD)bytes读或者是忽略head_size大小4.Ifendofarchiveencounteredthenterminatearchiveprocessing,elseread7bytesintofieldsHEAD_CRC,HEAD_TYPE,HEAD_FLAGS,HEAD_SIZE.如果归档遭遇结束,那么终止归档过程,不然的话,读7个字节在区域head_crc,head_type,head_flags,head_size5.CheckHEAD_TYPE.检查head_TYpeifHEAD_TYPE==0x74readfileheader(first7bytesalreadyread)读文件头readorskipHEAD_SIZE-sizeof(FILE_HEAD)bytes读或者忽略head_sizeif(HEAD_FLAGS&0x100)readorskipHIGH_PACK_SIZE*0x1000000x520x610x720x210x1a0x070x00000+PACK_SIZEbytes读或者忽略high_pack_sizeelsereadorskipPACK_SIZEbytes读或者是忽略pack_sizeelsereadcorrespondingHEAD_TYPEblock:读相应的head_type块readHEAD_SIZE-7bytesif(HEAD_FLAGS&0x8000)readADD_SIZEbytes6.goto4.转到第4步==========================================================================BlockFormats块格式==========================================================================Markerblock(MARK_HEAD)标志块HEAD_CRCAlways0x61522bytesHEAD_TYPEHeadertype:0x721byteHEAD_FLAGSAlways0x1a212bytesHEAD_SIZEBlocksize=0x00072bytesThemarkerblockisactuallyconsideredasafixedbytesequence:0x520x610x720x210x1a0x070x00标志块事实上被认为是一个修复字节,次序:0x520x610x720x210x1a0x070x00Archiveheader(MAIN_HEAD)归档头部HEAD_CRCCRCoffieldsHEAD_TYPEtoRESERVED22bytesHEAD_TYPEHeadertype:0x731byteHEAD_FLAGSBitflags:2bytes0x0001-Volumeattribute(archivevolume)卷属性0x0002-Archivecommentpresent目前的归档内容RAR3.xusestheseparatecommentblockanddoesnotsetthisflag.RAR3.0使用独立的内容块,这个标志没有设定0x0004-Archivelockattribute归档锁属性0x0008-Solidattribute(solidarchive)”固态“属性0x0010-Newvolumenamingscheme('volname.partN.rar')新卷的命名方案0x0020-AuthenticityinformationpresentRAR3.xdoesnotsetthisflag.目前的授权信息,rar3.X没有这个标志0x0040-Recoveryrecordpresent当前的恢复记录0x0080-Blockheadersareencrypted块头是被加密的0x0100-Firstvolume(setonlybyRAR3.0andlater)第一个卷,只有RAR3.0以后的版本才被确立otherbitsinHEAD_FLAGSarereservedforinternaluse其他的位为国内用户保留HEAD_SIZEArchiveheadertotalsizeincludingarchivecomments2bytes归档头大小,包括归档内容。RESERVED1Reserved2bytesRESERVED2Reserved4bytesFileheader(Fileinarchive)文件头HEAD_CRCCRCoffieldsfromHEAD_TYPEtoFILEATTR2bytesandfilenameHEAD_TYPEHeadertype:0x741byteHEAD_FLAGSBitflags:2bytes0x01-filecontinuedfrompreviousvolume文件从前一个卷继续0x02-filecontinuedinnextvolume文件从后一个卷继续0x04-fileencryptedwithpassword文件使用密码加密0x08-filecommentpresent目前的文件内容RAR3.xusestheseparatecommentblockanddoesnotsetthisflag.0x10-informationfrompreviousfilesisused(solidflag)(forRAR2.0andlater)之前的文件信息被使用(RAR2.0以后版本可用)bits765(forRAR2.0andlater)000-dictionarysize64KB001-dictionarysize128KB010-dictionarysize256KB011-dictionarysize512KB100-dictionarysize1024KB101-dictionarysize2048KB110-dictionarysize4096KB111-fileisdirectory0x100-HIGH_PACK_SIZEandHIGH_UNP_SIZEfieldsarepresent.Thesefieldsareusedtoarchiveonlyverylargefiles(largerthan2Gb),forsmallerfilesthesefieldsareabsent.high_pack_size和high_unp_size区域被提出,这些区域仅仅在归档大于2GB的文件时候才管用,对于小文件,他们是缺席的0x200-FILE_NAMEcontainsbothusualandencodedUnicodenameseparatedbyzero.InthiscaseNAME_SIZEfieldisequaltothelengthofusualnameplusencodedUnicodenameplus1.file_name独立的包括普通的和可编码的双字节编码,在这种情况下,n
本文标题:rar文档结构分析
链接地址:https://www.777doc.com/doc-5174607 .html