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)
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
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)