Source code for vstruct.defs.rar

import vstruct
from vstruct.primitives import *

HEAD_TYPE_MARKER        = 0x72          #marker block
HEAD_TYPE_ARCHIVE       = 0x73          #archive header
HEAD_TYPE_FILE_HDR      = 0x74          #file header
HEAD_TYPE_OLD_COMMENT   = 0x75          #old style comment header
HEAD_TYPE_OLD_AUTH      = 0x76          #old style authenticity information
HEAD_TYPE_OLD_SUBBLOCK  = 0x77          #old style subblock
HEAD_TYPE_OLD_RECOVERY  = 0x78          #old style recovery record
HEAD_TYPE_OLD_AUTH2     = 0x79          #old style authenticity information
HEAD_TYPE_SUBBLOCK      = 0x7a          #subblock

[docs]class RarChunkUnkn(vstruct.VStruct): def __init__(self): vstruct.VStruct.__init__(self) self.CHUNK_BYTES = v_bytes()
[docs]class RarBlock(vstruct.VStruct): def __init__(self): vstruct.VStruct.__init__(self) self.HEAD_CRC = v_uint16() self.HEAD_TYPE = v_uint8() self.HEAD_FLAGS = v_uint16() self.HEAD_SIZE = v_uint16() self.ADD_SIZE = v_uint32() self.BLOCK_DATA = vstruct.VStruct()
[docs] def pcb_HEAD_FLAGS(self): # a proto callback for the header if self.HEAD_FLAGS & 0x8000: self.ADD_SIZE = v_uint32() else: self.ADD_SIZE = vstruct.VStruct()
[docs] def pcb_ADD_SIZE(self): hsize = 7 totsize = self.HEAD_SIZE if not isinstance(self.ADD_SIZE, vstruct.VStruct): hsize += 4 totsize += self.ADD_SIZE # We will *now* use TYPE to find out our chunk guts self.BLOCK_DATA = v_bytes(totsize - hsize)
if __name__ == '__main__': import sys offset = 0 b = file(sys.argv[1], 'rb').read() while offset < len(b): r = RarBlock() offset = r.vsParse( b, offset=offset) print r.tree()