计算我的二维码的校正字节

问题描述 投票:0回答:1

我正在制作一个二维码生成器,现在已经到了最后一步。我现在需要做的就是计算 Correctionbytes,以便扫描仪读取我的 QR 码。

https://www.thonky.com/qr-code-tutorial/error- Correction-coding#step-9-divide-the-message-polynomial-by-the-generator-polynomial

此链接显示了如何计算 Correctionbytes,也是我在代码中用作实现它的参考。

我的问题是我尝试遵循相同的步骤和说明,但没有得到正确的结果。

这是我计算校正字节的代码。我的函数收到两个数组。

messagePolynomial 数组拥有 QR 码的上下文,其中每个字符都是 ASCII 码。生成器数组具有生成多项式。我要做的就是通过多项式除法得到 Correctionbytes。上面的链接将详细解释它。

现在我正在制作一个具有固定尺寸和长度的原型。

QR 码大小为 21 x 21 版本 1,校正级别 L(低),这意味着我需要 7 个校正字节才能使我的 QR 码发挥作用。

我的生成多项式看起来像这样 [0, 87, 229, 146, 149, 238, 102, 21]; 我的消息多项式看起来像这样 [226, 72, 250, 250, 61, 5, 43, 61, 155, 250, 195, 138]

显示的值采用字母表示法。



private int[] CalculateCorrectionBytes(int[] messagePolynomial, int[] generator)
{
    int[] log = buildLog(buildAntiLog());
    int[] antilog = buildAntiLog();
    int[] correctionBytes = new int[generator.Length];

    int[] message = (int[])messagePolynomial.Clone();

    Console.WriteLine($"Generator polynomial in Alpha notation: [{string.Join(", ", generator)}]\n");

    
    for (int i = 0; i < message.Length; i++)
    {
        
        Console.WriteLine($"{i}. Message character as integer: {message[i]}");
        message[i] = log[message[i]];
        Console.WriteLine($"{i}. Message character in Alpha notation: {message[i]}");
        Console.WriteLine("________________________________");
    }

    
    
    for (int i = 0; i < 5; i++)
    {
        int leadTerm = message[0];
        Console.WriteLine($"\n>>>>>  {i + 1}. Calculation step!  <<<<<\n");
        for (int j = 0; j < generator.Length; j++)
        {
            Console.WriteLine($"\n*****************************> {j + 1}. generator term <*****************************************");
            int logvalue = (leadTerm + generator[j]) % 255;
            Console.WriteLine($"The log value is {logvalue} when {leadTerm} plus {generator[j]} is calculated " +
                              $"and then modulo 255 is taken." +
                              $"---> {logvalue} = {leadTerm} + {generator[j]}");
            
            int antilogvalue = antilog[logvalue];
            Console.WriteLine($"The value of {logvalue} in AntiLog is {antilogvalue}");

            int xorvalue = antilog[message[j]] ^ antilogvalue;
            Console.WriteLine($"When {antilog[message[j]]} XOR {antilogvalue} ---> {antilog[message[j]]} XOR {antilogvalue} = {xorvalue}");
            
            Console.WriteLine($"The value {xorvalue} takes the place of message[{j}]({message[j]}).");
            message[j] = xorvalue;
        }
        Console.WriteLine($"message array after step {i + 1}: [{string.Join(", ", message)}]");
        // Remove the leading coefficient after it has been processed
        message = message.Skip(1).ToArray();

        // Output the new "reduced" temp[] array
        Console.WriteLine($"New message array after reduction {i + 1}: [{string.Join(", ", message)}]");
    }
    
    correctionBytes = (int[])message.Clone();
    Console.WriteLine($"Correction bytes after calculation: [{string.Join(", ", correctionBytes)}]\n");

    return correctionBytes;
}

当我通过代码运行我的值时,我得到这些值作为 Correctionbytes [146, 177, 89, 225, 238, 87, 248]。

问题是我使用 Thonkys 二维码生成器来查看我生成的二维码是否相同。除了更正字节之外,一切似乎都是正确的。那么有人可以帮助我吗?

c# generator qr-code polynomials reed-solomon
1个回答
0
投票

此行和任何其他使用 % 的行都可能出现问题:

int logvalue = (leadTerm + generator[j]) % 255;

C# % 是余数,而不是模数。如果结果不为零,则返回值的符号与被除数(余数)的符号相同,而不是除数(模)的符号,从而导致负结果。您可以使用以下方法解决此问题:

int logvalue = (leadTerm + generator[j]) % 255;
    if(logvalue < 0)
        logvalue = logvalue + 255;

但是对于所有数据使用

uint
而不是
int
会更简单:消息,生成多项式,...

© www.soinside.com 2019 - 2024. All rights reserved.