我正在制作一个二维码生成器,现在已经到了最后一步。我现在需要做的就是计算 Correctionbytes,以便扫描仪读取我的 QR 码。
此链接显示了如何计算 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 二维码生成器来查看我生成的二维码是否相同。除了更正字节之外,一切似乎都是正确的。那么有人可以帮助我吗?
此行和任何其他使用 % 的行都可能出现问题:
int logvalue = (leadTerm + generator[j]) % 255;
C# % 是余数,而不是模数。如果结果不为零,则返回值的符号与被除数(余数)的符号相同,而不是除数(模)的符号,从而导致负结果。您可以使用以下方法解决此问题:
int logvalue = (leadTerm + generator[j]) % 255;
if(logvalue < 0)
logvalue = logvalue + 255;
但是对于所有数据使用
uint
而不是 int
会更简单:消息,生成多项式,...