Created
June 5, 2015 04:22
-
-
Save xdqi/d9df112e01dea05665e9 to your computer and use it in GitHub Desktop.
QZIP tools
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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