Пример #1
0
    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')
Пример #2
0
    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')