def degree_decodeFile(compressed_file_name): encoded_text = readFile(compressed_file_name) encoded_text = encoded_text.read('bin:{0}'.format(len(encoded_text))) encoded_text, file_name_lenght = getBits(encoded_text, 8) file_name_lenght = int(file_name_lenght, base=2) # gaunam failo pavadinimo ilgi encoded_text, file_name = getBits(encoded_text, file_name_lenght) file_name = ''.join( [chr(int(file_name[i:i + 8], base=2)) for i in range(0, len(file_name), 8)]) # gaunam orig. failo pav. encoded_text, degree = getBits(encoded_text, 8) degree = int(degree, base=2) encoded_text, context_huffman_list_lenght = getBits(encoded_text, 16 * int(degree)) context_huffman_list_lenght = int(context_huffman_list_lenght, base=2) # lenteles ilgis context_huffman_list = [] huffman_list = [] for i in range(context_huffman_list_lenght): encoded_text, context = getBits(encoded_text, 8 * degree) encoded_text, list_lenght = getBits(encoded_text, 8) list_lenght = int(list_lenght, base=2) for j in range(list_lenght): encoded_text, bite = getBits(encoded_text, 8) encoded_text, v_lenght = getBits(encoded_text, 8) v_lenght = int(v_lenght, base=2) # uzkodavimo ilgis v_size = bestSize(v_lenght) encoded_text, temp_value = getBits(encoded_text, v_size) temp_value = temp_value.replace('0', '', v_size - v_lenght) huffman_list.append([bite, temp_value]) context_huffman_list.append([context, huffman_list]) huffman_list = [] encoded_text, text_lenght = getBits(encoded_text, 32) text_lenght = int(text_lenght, base=2) # teksto ilgis text_full_size = bestSize(text_lenght) encoded_text, encoded_text = getBits(encoded_text, text_full_size) # uzkoduotas tekstas encoded_text = encoded_text.replace('0', '', text_full_size - text_lenght) if int(degree) == 1: bites = degree_decodeText(context_huffman_list, encoded_text) # atkoduojame else: bites = second_degree_burn_decodeText(context_huffman_list, encoded_text) text = ''.join(bites) # print(context_huffman_list) # print(text) with open(file_name, 'wb') as f: # orig. teksta atgal i faila write_buffer = ConstBitStream(bin=text) write_buffer.tofile(f)
def printFile(encoded_text, right, left, file_name, num_of_bytes): with open(file_name + '_compressed_file_{0}.bin'.format(num_of_bytes), 'wb') as w: file_name_binary = [format(ord(i), 'b') for i in file_name] for index, byte in enumerate(file_name_binary): file_name_binary[index] = convertToRequiredSize(int(byte, base=2), 8) file_name_binary = ''.join(file_name_binary) file_name_lenght_binary = convertToRequiredSize(len(file_name_binary), 8) write_buffer = ConstBitStream(bin=file_name_lenght_binary) # failo pavadinimo ilgis write_buffer.tofile(w) write_buffer = ConstBitStream(bin=file_name_binary) # failo pavadinimas write_buffer.tofile(w) num_of_bytes_binary = convertToRequiredSize(int(num_of_bytes), 8) write_buffer = ConstBitStream(bin=num_of_bytes_binary) # kokias bitu gabalais buvo nuskaitytas tekstas write_buffer.tofile(w) best_k_size = bestSize(int(num_of_bytes)) left_table_lenght_binary = convertToRequiredSize(len(left), int(best_k_size)) write_buffer = ConstBitStream(bin=left_table_lenght_binary) # lenteles ilgis write_buffer.tofile(w) right_table_lenght_binary = convertToRequiredSize(len(right), int(best_k_size)) write_buffer = ConstBitStream(bin=right_table_lenght_binary) # lenteles ilgis write_buffer.tofile(w) for k, v in left: padded_k = k.zfill(best_k_size) write_buffer = ConstBitStream(bin=padded_k) # zodis write_buffer.tofile(w) v_lenght_binary = convertToRequiredSize(len(v), 8) write_buffer = ConstBitStream(bin=v_lenght_binary) # uzkodavimo ilgis write_buffer.tofile(w) best_v_size = bestSize(len(v)) padded_v = v.zfill(best_v_size) write_buffer = ConstBitStream(bin=padded_v) # uzkodavimas write_buffer.tofile(w) for k, v in right: padded_k = k.zfill(best_k_size) write_buffer = ConstBitStream(bin=padded_k) # zodis write_buffer.tofile(w) v_lenght_binary = convertToRequiredSize(len(v), 8) write_buffer = ConstBitStream(bin=v_lenght_binary) # uzkodavimo ilgis write_buffer.tofile(w) best_v_size = bestSize(len(v)) padded_v = v.zfill(best_v_size) write_buffer = ConstBitStream(bin=padded_v) # uzkodavimas write_buffer.tofile(w) text_lenght = len(encoded_text) # teksto ilgis text_lenght_binary = convertToRequiredSize(text_lenght, 32) write_buffer = ConstBitStream(bin=text_lenght_binary) write_buffer.tofile(w) best_text_size = bestSize(len(encoded_text)) padded_encoded_text = encoded_text.zfill(best_text_size) write_buffer = ConstBitStream(bin=padded_encoded_text) # uzkoduotas tekstas write_buffer.tofile(w)
def decodeFile(compressed_file_name): encoded_text = readFile(compressed_file_name) encoded_text = encoded_text.read('bin:{0}'.format(len(encoded_text))) encoded_text, file_name_lenght = getBits(encoded_text, 8) file_name_lenght = int(file_name_lenght, base=2) # gaunam failo pavadinimo ilgi encoded_text, file_name = getBits(encoded_text, file_name_lenght) file_name = ''.join( [chr(int(file_name[i:i + 8], base=2)) for i in range(0, len(file_name), 8)]) # gaunam orig. failo pav. encoded_text, num_of_bytes = getBits(encoded_text, 8) num_of_bytes = int(num_of_bytes, base=2) k_size = bestSize(int(num_of_bytes)) encoded_text, left_table_lenght = getBits(encoded_text, int(k_size)) left_table_lenght = left_table_lenght.replace('0', '', k_size - num_of_bytes) left_table_lenght = int(left_table_lenght, base=2) # lenteles ilgis encoded_text, right_table_lenght = getBits(encoded_text, int(k_size)) right_table_lenght = right_table_lenght.replace('0', '', k_size - num_of_bytes) right_table_lenght = int(right_table_lenght, base=2) # lenteles ilgis left_table_dict = {} right_table_dict = {} for line in range(left_table_lenght): encoded_text, temp_key = getBits(encoded_text, k_size) temp_key = temp_key.replace('0', '', k_size - num_of_bytes) # zodis encoded_text, v_lenght = getBits(encoded_text, 8) v_lenght = int(v_lenght, base=2) # uzkodavimo ilgis v_size = bestSize(v_lenght) encoded_text, temp_value = getBits(encoded_text, v_size) temp_value = temp_value.replace('0', '', v_size - v_lenght) # uzkodavimas left_table_dict[temp_key] = temp_value # I lentele for line in range(right_table_lenght): encoded_text, temp_key = getBits(encoded_text, k_size) temp_key = temp_key.replace('0', '', k_size - num_of_bytes) # zodis encoded_text, v_lenght = getBits(encoded_text, 8) v_lenght = int(v_lenght, base=2) # uzkodavimo ilgis v_size = bestSize(v_lenght) encoded_text, temp_value = getBits(encoded_text, v_size) temp_value = temp_value.replace('0', '', v_size - v_lenght) # uzkodavimas right_table_dict[temp_key] = temp_value # I lentele encoded_text, text_lenght = getBits(encoded_text, 32) text_lenght = int(text_lenght, base=2) # teksto ilgis text_full_size = bestSize(text_lenght) encoded_text, encoded_text = getBits(encoded_text, text_full_size) # uzkoduotas tekstas encoded_text = encoded_text.replace('0', '', text_full_size - text_lenght) bites = decodeText(encoded_text, left_table_dict, right_table_dict) # atkoduojame text = ''.join(bites) with open(file_name, 'wb') as f: # orig. teksta atgal i faila write_buffer = ConstBitStream(bin=text) write_buffer.tofile(f)
def degree_printFile(context_huffman_list, encoded_text, degree, file_name): with open(file_name + 'compressed_file_degree_{0}.bin'.format(degree), 'wb') as w: file_name_binary = [format(ord(i), 'b') for i in file_name] for index, byte in enumerate(file_name_binary): file_name_binary[index] = convertToRequiredSize(int(byte, base=2), 8) file_name_binary = ''.join(file_name_binary) file_name_lenght_binary = convertToRequiredSize(len(file_name_binary), 8) write_buffer = ConstBitStream(bin=file_name_lenght_binary) # failo pavadinimo ilgis write_buffer.tofile(w) write_buffer = ConstBitStream(bin=file_name_binary) # failo pavadinimas write_buffer.tofile(w) degree_binary = convertToRequiredSize(int(degree), 8) write_buffer = ConstBitStream(bin=degree_binary) # kokias bitu gabalais buvo nuskaitytas tekstas write_buffer.tofile(w) context_huffman_list_binary = convertToRequiredSize(len(context_huffman_list), 16 * int(degree)) write_buffer = ConstBitStream(bin=context_huffman_list_binary) write_buffer.tofile(w) for line in context_huffman_list: write_buffer = ConstBitStream(bin=line[0]) write_buffer.tofile(w) if len(line[1]) == 2: if len(line[1][0]) != 2: line[1] = [line[1]] list_lenght_binary = convertToRequiredSize(len(line[1]), 8) write_buffer = ConstBitStream(bin=list_lenght_binary) write_buffer.tofile(w) for [k, v] in line[1]: write_buffer = ConstBitStream(bin=k) # zodis write_buffer.tofile(w) v_lenght_binary = convertToRequiredSize(len(v), 8) write_buffer = ConstBitStream(bin=v_lenght_binary) # uzkodavimo ilgis write_buffer.tofile(w) best_v_size = bestSize(len(v)) padded_v = v.zfill(best_v_size) write_buffer = ConstBitStream(bin=padded_v) # uzkodavimas write_buffer.tofile(w) text_lenght = len(encoded_text) # teksto ilgis text_lenght_binary = convertToRequiredSize(text_lenght, 32) write_buffer = ConstBitStream(bin=text_lenght_binary) write_buffer.tofile(w) best_text_size = bestSize(len(encoded_text)) padded_encoded_text = encoded_text.zfill(best_text_size) write_buffer = ConstBitStream(bin=padded_encoded_text) # uzkoduotas tekstas write_buffer.tofile(w)