def decode(self, message: list, error_size: int) -> str: """ :param message: 具有奇偶校验位的消息,它可能包含错误,也可能不包含错误 :param error_size: 错误符号的数目 :return:一个解码的消息,如果可能的话 """ buffer = copy.deepcopy(message) #首先检查是否有擦除 erasures = [] for position in range(len(buffer)): if buffer[position] < 0: buffer[position] = 0 erasures.append(position) # 错误太多 退出 if len(erasures) > error_size: raise ReedSolomonError("Too many erasures") # 计算伴随多项式 syndrome_polynomial = Polynomial.syndromePolynomial(buffer, error_size) if max(syndrome_polynomial) == 0: return bytearray(buffer[:-error_size]).decode('utf-8') forney_syndromes = self.forneySyndromes(syndrome_polynomial, erasures, buffer) error_list = self.findErrors(forney_syndromes, len(message)) if error_list is None: raise ReedSolomonError("Could not find errors") decoded_symbols = self.correct(buffer, syndrome_polynomial, (erasures + error_list)) return bytearray(decoded_symbols[:-error_size]).decode('utf-8')
def decode(self, message: list, error_size: int) -> str: """ :param message: a message with parity bits which might or might not contain errors :param error_size: the number of error symbols :return: a decoded message if possible """ buffer = copy.deepcopy(message) # First check if there's any erasures erasures = [] for position in range(len(buffer)): if buffer[position] < 0: buffer[position] = 0 erasures.append(position) # Quit if we have too many erasures if len(erasures) > error_size: raise ReedSolomonError("Too many erasures") # Calculate the syndrome polynomial syndrome_polynomial = Polynomial.syndromePolynomial(buffer, error_size) if max(syndrome_polynomial) == 0: return bytearray(buffer[:-error_size]).decode('utf-8') # Calculate the Forney syndromes - removes the erasures from the syndrome polynomial forney_syndromes = self.forneySyndromes(syndrome_polynomial, erasures, buffer) # Calculate a list of errors in the message using Berlekamp-Massey algorithm error_list = self.findErrors(forney_syndromes, len(message)) if error_list is None: raise ReedSolomonError("Could not find errors") # Correct the erasures and errors in the message using the Forney algorithm decoded_symbols = self.correct(buffer, syndrome_polynomial, (erasures + error_list)) return bytearray(decoded_symbols[:-error_size]).decode('utf-8')