Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. import time
  2.  
  3. def mkfile(filename,data):
  4. """
  5. Record struct:
  6. 10 byte - block size
  7. 4 byte - filename length
  8. n byte - filename
  9. 4 byte - file size
  10. n bytes - data
  11. """
  12. mnt = b""
  13. # base info starts here
  14. mnt += int.to_bytes(len(filename), 4, 'little') # file name size
  15. mnt += filename.encode() # file name
  16. mnt += int.to_bytes(len(data), 4, 'little') # file size
  17. mnt += data
  18. mnt = int.to_bytes(len(mnt), 10, 'little')+mnt
  19. return mnt
  20.  
  21. def parse_block(block):
  22. """
  23. output is: (file name, file size, data)
  24. """
  25. size = int.from_bytes(block[:4], 'little')
  26. block = block[4:]
  27. filename = block[:size]
  28. block = block[size:]
  29. dlen = int.from_bytes(block[:4], 'little')
  30. block = block[4:]
  31. return filename, dlen, block
  32.  
  33. def parse_blocks(data):
  34. blocks = []
  35. while True:
  36. bk = data[:10]
  37. if len(bk) == 0:
  38. break
  39. blklen = int.from_bytes(bk,'little')
  40. blk = data[10:blklen+10] # ahuet blad
  41. blocks.append(parse_block(blk))
  42. data = data[10+blklen:]
  43. return blocks
  44.  
  45. def mkheader(fname,compression=False, compressionFn=0, encryption=0, encFn=None):
  46. """
  47. Header format:
  48. 8 bytes - header size
  49. 4 bytes - file name length
  50. n bytes - file name
  51. 1 byte - compression
  52. 1 byte - encryption
  53. """
  54. version = 1
  55. mnt = b""
  56. mnt += int.to_bytes(len(fname), 4, 'little')
  57. mnt += fname.encode()
  58. mnt += chr(int(compression)).encode()
  59. mnt += chr(int(encryption)).encode()
  60. mnt = int.to_bytes(len(mnt), 8, 'little')+mnt
  61. return mnt
  62.  
  63. class Archive:
  64. def __init__(self,name):
  65. self.fo = open(name+".ridefs", "ab+")
  66. self.fo.write(mkheader(name))
  67.  
  68. def add_file(self,name,data):
  69. self.fo.write(mkfile(name,data))
  70.  
  71. def cls(self):
  72. self.fo.close()
  73.  
  74. def __del__(self):
  75. self.cls()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement