コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
0
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)
コード例 #4
0
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)