Exemple #1
0
    def decode_file(self, file_in, file_out, make_table, is_fix_err: bool = True):
        """
        Have inner dependence from method encode_file
        Doesn't recomended to call it without calling the encode_file method.
        You can get back more bits what in really msg.

        Example
        You have n = 15, k=9
        and lenght of msg in bits is 136.
        To decode msg u need extend bitarry to 144 bit (144⋮ 9 144⋮ 8). And it also divide by 8 without remain.
        144 = 8 * 9 * 2
        And after decoding, u need delete byte at the end of msg

        And in other case u have msg with 144 bits lenght
        :param file_in:
        :param file_out:
        :param make_table: function is returned the special dict. See CyclicCode.make_table()
        :param is_fix_err:
        :return:
        """
        bit_a = ba.bitarray()
        bit_a.fromfile(file_in)

        print(f"endcode {len(bit_a)}, {bit_a}")
        bit_a = BaseCode.add_to_multiplicity_n(bit_a, self.n, is_to_less=True)
        print(f"endcode {len(bit_a)}, {bit_a}")

        decode = self.decode_sys(bit_a, make_table, is_fix_err=is_fix_err)

        key = len(decode)
        true_len = self.bone.setdefault(key, None)
        if true_len:
            decode = decode[:true_len]
        # clear the memory
        del self.bone[key]

        print(f"decode  {len(decode)}, {decode}")
        # decode = BaseCode.add_to_multiplicity_n(decode, 8, is_to_less=True)
        decode.tofile(file_out)
Exemple #2
0
    def decode_sys(self, bit_arr: ba.bitarray, make_table, is_fix_err: bool = True):
        """
        With correct.
        :param bit_arr:
        :param is_reshaped:
        :return:
        """
        bit_arr = BaseCode.add_to_multiplicity_n(bit_arr, self.n)
        decoded = ba.bitarray()
        remain_d = None
        syndromes = None
        if is_fix_err:
            remain_d = self.remain_dev(bit_arr)
            syndromes = make_table()

        # print("len synd", len(syndromes))
        for i in range(len(bit_arr) // self.n):
            i_beg = i * self.n
            if is_fix_err:
                # print(self.n_k)
                key = self.ba_to_str_bits(remain_d[i_beg:i_beg + self.n_k])
                index_err_bit = syndromes[key]
                if len(index_err_bit):
                    print(bit_arr)
                    for index_err in index_err_bit:
                        bit_arr[i_beg + index_err] = not bit_arr[i_beg + index_err]
                    else:
                        print(" " * (10 + i_beg + index_err_bit[0]) + "|" * (2))
                        print(bit_arr)
                        print(index_err_bit)
                        print(key)

                        print(f"{index_err_bit[0]} from {self.n}", )
                        print(f"error fount. It index is {i_beg + index_err_bit[0]}", "\n")

            decoded.extend(bit_arr[i_beg + self.n_k:i_beg + self.n])

        return decoded
Exemple #3
0
    def encode_file(self, file_in, file_out):
        """

        :param file_in:
        :param file_out:
        :return:
        """

        bit_a = ba.bitarray()
        bit_a.fromfile(file_in)
        len_bit_a = len(bit_a)

        print(f"our msg {len(bit_a)}, {bit_a}")
        bit_a = BaseCode.add_to_multiplicity_n(bit_a, self.k)
        print(f"our msg {len(bit_a)}, {bit_a}")

        if len(bit_a) - len_bit_a >= 8:
            self.bone[len(bit_a)] = len_bit_a

        encode = self.encody_sys(bit_a)
        print(f"endcode {len(encode)}, {encode}")

        encode.tofile(file_out)