Skip to content

Instantly share code, notes, and snippets.

@xdqi
Created June 5, 2015 04:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xdqi/d9df112e01dea05665e9 to your computer and use it in GitHub Desktop.
Save xdqi/d9df112e01dea05665e9 to your computer and use it in GitHub Desktop.
QZIP tools
#!/usr/bin/env python3
import sys
import os
import struct
import codecs
import PyQt4.QtCore
directory_path = sys.argv[1]
filenames = []
filename_header = bytearray()
fileblobs = bytearray()
file_without_checksum = bytearray()
for directory, _, files in os.walk(directory_path):
for file in files:
filename = os.path.relpath(os.path.abspath(directory + '/' + file), os.path.abspath(directory_path))
filenames.append(filename)
# Compress all files into a bytearray
for filename in filenames:
file_object = open(directory_path + '/' + filename, 'rb')
file_content = file_object.read()
source_qbytearray = PyQt4.QtCore.QByteArray(file_content)
file_object.close()
compressed_qbytearray = PyQt4.QtCore.qCompress(source_qbytearray, 9)
compressed_bytes = bytes(compressed_qbytearray)
compressed_length = len(compressed_bytes)
binary_compressed_length = struct.pack("!I", compressed_length)
compressed_checksum = PyQt4.QtCore.qChecksum(compressed_bytes)
binary_compressed_checksum = struct.pack("!H", compressed_checksum)
fileblobs.extend(binary_compressed_length)
fileblobs.extend(compressed_bytes)
fileblobs.extend(binary_compressed_checksum)
# Write File name headers
directory_name = os.path.basename(directory_path)
binary_directory_name = codecs.encode(directory_name, 'utf_16_be')
print(binary_directory_name)
binary_directory_name_size = struct.pack("!I", len(binary_directory_name))
binary_directory_size = struct.pack("!I", len(filenames))
filename_header.extend(binary_directory_name_size)
filename_header.extend(binary_directory_name)
filename_header.extend(binary_directory_size)
for filename in filenames:
binary_filename = codecs.encode(filename, 'utf_16_be')
binary_filename_length = struct.pack('!I', len(binary_filename))
filename_header.extend(binary_filename_length)
filename_header.extend(binary_filename)
file_without_checksum = filename_header + fileblobs
whole_file_checksum = PyQt4.QtCore.qChecksum(file_without_checksum)
binary_whole_file_checksum = struct.pack("!H", whole_file_checksum)
write_file_object = open(os.path.basename(directory_path) + '.qzip', 'wb')
write_file_object.write(binary_whole_file_checksum)
write_file_object.write(file_without_checksum)
write_file_object.close()
#!/usr/bin/env python3
import sys
import os
import struct
import codecs
import PyQt4.QtCore
filename = sys.argv[1]
file_object = open(filename, 'rb')
binary_checksum = file_object.read(2)
checksum = struct.unpack("!H", binary_checksum)[0]
other_parts = file_object.read()
assert checksum == PyQt4.QtCore.qChecksum(other_parts)
file_object.close()
file_object = open(filename, 'rb')
file_object.read(2)
binary_size_of_folder_name = file_object.read(4)
size_of_folder_name = struct.unpack("!I", binary_size_of_folder_name)[0]
binary_folder_name = file_object.read(size_of_folder_name)
folder_name = codecs.decode(binary_folder_name, 'utf_16_be')
binary_number_of_files_in_folder = file_object.read(4)
number_of_files_in_folder = struct.unpack("!I", binary_number_of_files_in_folder)[0]
filenames = []
for file_name_no in range(number_of_files_in_folder):
binary_size_of_file_name = file_object.read(4)
size_of_file_name = struct.unpack("!I", binary_size_of_file_name)[0]
binary_file_name = file_object.read(size_of_file_name)
file_name = codecs.decode(binary_file_name, 'utf_16_be')
filenames.append(file_name)
for file_name in filenames:
binary_size_of_file = file_object.read(4)
size = struct.unpack("!I", binary_size_of_file)[0]
compressed_data = file_object.read(size)
compressed_qbytearray = PyQt4.QtCore.QByteArray(compressed_data)
blob_qbytearray = PyQt4.QtCore.qUncompress(compressed_qbytearray)
blob_string = bytes(blob_qbytearray)
binary_file_checksum = file_object.read(2)
file_checksum = struct.unpack("!H", binary_file_checksum)[0]
assert file_checksum == PyQt4.QtCore.qChecksum(compressed_data)
source_file_path = folder_name + '/' + file_name
if not os.path.exists(os.path.dirname(source_file_path)):
os.makedirs(os.path.dirname(source_file_path))
source_file_object = open(source_file_path, 'wb')
source_file_object.write(blob_string)
source_file_object.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment