pdf417 создание штрих-кода, несоответствие кодовых слов исправления ошибок Рида Соломона между python и JAVA - PullRequest
0 голосов
/ 20 мая 2018

Я создал штрих-код pdf417, используя библиотеку Python pdf417gen.

Штрих-код представлял собой графическое представление строки «M1LONG».Штрих-код имеет два столбца данных, и уровень безопасности исправления ошибок Рида-Соломона установлен на «1».Это указывает на то, что при вводе восьми кодовых слов данных число кодовых слов с исправлением ошибок должно равняться четырем.

Выходные данные Python отображают кодовые слова данных от D07 до D00 как {8, 389, 902, 11, 900, 344, 396, 900}.Питон перечисляет кодовые слова исправления ошибок от C03 до C00 как {718, 801, 313, 877}.Вот Python, который использовался для генерации всех кодовых слов:

from builtins import range

from .data import ERROR_CORRECTION_FACTORS

def compute_error_correction_code_words(data_words, level):
    assert 0 <= level <= 8

    # Correction factors for the given level
    factors = ERROR_CORRECTION_FACTORS[level]

    # Number of EC words
    count = 2 ** (level + 1)

    # Correction code words list, prepopulated with zeros
    ec_words = [0] * count

    # Do the math
    for data_word in data_words:
        temp = (data_word + ec_words[-1]) % 929

        for x in range(count - 1, -1, -1):
            word = ec_words[x - 1] if x > 0 else 0
            ec_words[x] = (word + 929 - (temp * factors[x]) % 929) % 929

    return [929 - x if x > 0 else x for x in reversed(ec_words)]

Кодовые слова для исправления ошибок генерируются с использованием полиномов, арифметики поля Галуа и дополнений к модулю 929, который является числом возможных кодовых слов для pdf417.система.В расчетах используется ряд факторов для упрощения процесса.Для уровня безопасности 1 рекомендуемое количество факторов - четыре.Факторы 522,568,723,809

http://grandzebu.net/informatique/codbar/pdf417coef.txt

Проблема заключается в следующем.Я попытался воссоздать кодовые слова ошибок, используя псевдокод JAVA, полученный из http://grandzebu.net/informatique/codbar-en/pdf417.htm

. Я написал программу JAVA, чтобы попытаться сгенерировать те же кодовые слова, что и программное обеспечение Python, описанное выше, но он не генерируетте же кодовые слова ошибки.

JAVA-программа компилируется и запускается, математика выглядит хорошо для моего неопытного глаза, но полученные коды ошибок не совпадают.Вот мой JAVA, переменные JAVA называются такими же, как Python, чтобы упростить сравнение двух программ.

import java.util.Arrays;

public class reedsolomon{

    public static void main (String[] args){

        int ec_words[] = new int[4];//correction codewords array
        int temp=0;//holding variable
        int count=4; //number of error correction codewords
        int data_words[] = {8,389,902,11,900,344,396,900};// eight data codewords array D7 to D0.
        int factors[]= {522,568,723,809}; //factors or coefficients array.
        for(int i=0; i<data_words.length-1; i++) { 
            temp=(data_words[i] + ec_words[count-1])%929;
            for(int x=count-1; x>-1; x--){
                if(x==0){
                    ec_words[x] = (929-(temp*factors[x])%929)%929; //negative values in the Galois Field
                    //GF(929) are equal to the complement of itself if
                    //ec_words[x] > -929
                }
                else{
                    ec_words[x]=(ec_words[x-1]+929-(temp*factors[x])%929) %929; //negative values in the Galois Field
                    //GF(929) are equal to the complement of the
                    //remainder (ec_words[x] /929) if ec_words[x] <= -929.
                }
            }
        }
        for(int j=0; j<count; j++){
            if(ec_words[j] != 0){
                ec_words[j]=929-ec_words[j]; 
            }
        }System.out.println("Error codewords are " + Arrays.toString(ec_words));
    }
}

Я был бы очень признателен, если узнаю, в чем заключается проблема с кодом JAVA, которыйне позволяет генерировать те же кодовые слова с ошибками, что и программа python, содержащаяся в библиотеке pdf417gen.

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Некоторые уточнения (по крайней мере, для других читающих эту ветку).«Факторы» на самом деле являются коэффициентами к полиному генератора g (x) = (x-3) (x-3 ^ 2) (x-3 ^ 3) (x-3 ^ 4) в GF (929) = 1 x^ 4 + 809 x ^ 3 + 723 x ^ 2 + 568 x + 522. Процесс кодирования обрабатывает данные как полином m (x), умножает их на x ^ 4, чтобы создать место для 4 байтов четности, а затем делит m(x) x ^ 4 / g (x), получая остаток r (x).Тогда закодированное кодовое слово имеет вид m (x) x ^ 4 - r (x) = 8 x ^ 11 + 389 x ^ 10 + 902 x ^ 9 + 11 x ^ 8 + 900 x ^ 7 + 344 x ^ 6 + 396x ^ 5 + 900 x ^ 4 + 718 x ^ 3 + 801 x ^ 2 + 313 x + 877.

Статья Wiki также использует GF (929) и тот же полином генератора в своих примерах просмотра BCH:

https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction#Example_3

Количество возможных кодовых слов для RS (12,8) GF (929) составляет 929 ^ 8 (огромное количество).

0 голосов
/ 20 мая 2018

В вашем коде есть две проблемы.

  1. Самое важное: вы не обрабатываете все слова.Ваш код читает:

    for(int i=0; i<data_words.length-1; i++) { 
    

    Но он должен читать:

    for(int i=0; i < data_words.length; i++) {
    

    В цикле for вы пропускаете последнее слово данных в data_words[data_words.length-1]

  2. Вы не обращаете массив ec_words в коде Java, как вы делаете в Python, поэтому результат будет в обратном порядке в ec_words.

С первым исправлениемприменяется, результат из кода Java:

Error codewords are [877, 313, 801, 718]
...