qazmlpok

First disaster rebuild

Jul 13th, 2012
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.61 KB | None | 0 0
  1. import os
  2. import sys
  3.  
  4. #Constants taken from insani tools.
  5. LITTLE_ENDIAN = 1
  6. BIG_ENDIAN = -1
  7.  
  8. BYTE_LENGTH = 1
  9. SHORT_LENGTH = 2
  10. INT_LENGTH = 4
  11. LONG_LENGTH = 8
  12.  
  13. ERROR_NONE = 0
  14. ERROR_WARNING = 1
  15. ERROR_ABORT = 2
  16.  
  17.  
  18. def converttoint(bytes, size=INT_LENGTH, endian=LITTLE_ENDIAN):
  19.     result = 0
  20.     for i in xrange(size):
  21.         temp=long(ord(bytes[i]))
  22.         if endian == LITTLE_ENDIAN :
  23.             result |= (temp << (8*i))
  24.         elif endian == BIG_ENDIAN :
  25.             result = (result << 8) | temp
  26.         else :
  27.                 raise Exception('converttoint: Unknown endian specification')
  28.  
  29.         return result
  30.  
  31. def convertfromint(value, size=INT_LENGTH, endian=LITTLE_ENDIAN):
  32.     result = ""
  33.     for i in xrange(size):
  34.         if endian == LITTLE_ENDIAN :
  35.             #result |= (temp << (8*i))
  36.             temp = (value >> (8*i)) & 0x00FF
  37.         elif endian == BIG_ENDIAN :
  38.             #result = (result << 8) | temp
  39.             temp = (value >> (8*(size-i-1))) & 0x00FF
  40.         else :
  41.                 raise Exception('convertfromint: Unknown endian specification')
  42.             result += chr(temp)
  43.  
  44.         return result
  45.  
  46.  
  47. #===========================================
  48.  
  49. files = sys.argv[1:]
  50. for filename in files:
  51.     crc = None
  52.  
  53.     if (not os.path.isdir(filename)):
  54.         print filename, 'is not a directory.'
  55.         continue
  56.  
  57.     entries = []
  58.     indexsize = 4
  59.     for (root, dirs, dirfiles) in os.walk(filename):
  60.         #first = dirfiles.pop(0)
  61.         #dirfiles.append(first)
  62.  
  63.         for name in dirfiles:
  64.             entry = {}
  65.  
  66.             #fuck. someimes need dir.....
  67.             entry['filename'] = os.path.join(root, name)
  68.             #entry['name'] = name[4:]       #If using forced order
  69.             entry['name'] = entry['filename'][len(filename)+1:].replace('\\', '/')
  70.             stat = os.stat(entry['filename'])
  71.             entry['size'] = stat.st_size
  72.             entries.append(entry)
  73.  
  74.             indexsize += 12     #namelen, start, size
  75.             indexsize += len(entry['name']) + 1 #filename
  76.  
  77.     #filecount = convertfromint(len(entries))
  78.  
  79.     print 'size', indexsize
  80.  
  81.     outfile = open(filename + '.dat', 'wb')
  82.     outfile.write(convertfromint(indexsize))
  83.  
  84.     filestart = indexsize
  85.     for entry in entries:
  86.         outfile.write(convertfromint(len(entry['name']) + 1))
  87.         outfile.write(entry['name'])
  88.         outfile.write('\0')
  89.  
  90.         filesize = entry['size']
  91.         outfile.write(convertfromint(filesize))
  92.         outfile.write(convertfromint(filestart))
  93.  
  94.  
  95.         #write file data
  96.         position = outfile.tell()
  97.  
  98.         outfile.seek(filestart)
  99.         infile = open(entry['filename'], 'rb')
  100.         data = infile.read()
  101.         infile.close()
  102.         outfile.write(data)
  103.  
  104.         #Go back to the index
  105.         outfile.seek(position)
  106.  
  107.         print 'Adding', entry['name'], 'with size', entry['size'], 'to position', filestart
  108.  
  109.         #update filestart for the next file
  110.         filestart += filesize
Advertisement
Add Comment
Please, Sign In to add comment