pdf417条形码创建,Reed Solomon纠错码字python和JAVA之间的差异

时间:2018-05-20 02:03:31

标签: java barcode error-correction reed-solomon pdf417

我使用Python库pdf417gen创建了一个pdf417条形码。

条形码是字符串" M1LONG"的图形表示。条形码有两个数据列,Reed Solomon纠错安全级别设置为" 1"。这表明,对于8个数据码字的输入,纠错码字的数量应该是4。

Python输出将D07到D00的数据代码字显示为{8, 389, 902, 11, 900, 344, 396, 900}。 python将来自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的补码生成纠错码字,模数929是pdf417系统的可能码字的数量。计算使用许多因素来简化过程。对于安全级别1,建议的因子数为4。因素是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代码的问题是什么,它阻止它生成与库pdf417gen中包含的python程序相同的错误代码字。

2 个答案:

答案 0 :(得分:0)

您的代码中存在两个问题。

  1. 最重要的一个:你没有处理所有的单词。您的代码为:

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

    但它应该是:

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

    在for-loop中,您错过了data_words[data_words.length-1]

  2. 中的最后一个数据字
  3. 您没有像在python中那样反转Java代码中的ec_words数组,因此结果与ec_words中的结果相反。
  4. 应用第一个修补程序后,Java代码的结果是:

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

答案 1 :(得分:0)

一些澄清(至少对其他人来说,阅读这个帖子)。 &#34;因素&#34;实际上是生成多项式的系数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 + 396 x ^ 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(数字庞大)。