我有一个dll应用程序。在这个应用程序中,我将在有关提取的信息中扩展一些values.There。。

我从这个c#指南中写了链接代码来计算数字。我会比较一下。下面是我为c#编写的计算代码
private static int[] _weights = { 7, 3, 1 };
private static SortedDictionary<char, int> GetMappedDictionary()
{
string charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
SortedDictionary<char, int> mappedValues = new SortedDictionary<char, int>();
char[] charArr = charset.ToCharArray();
for (int i = 0; i < charArr.Length; ++i)
{
mappedValues[charArr[i]] = i;
}
mappedValues['<'] = 0;
return mappedValues;
}
private static int MrzComputeWeight(string line, int start, int end)
{
int sum = 0;
SortedDictionary<char, int> mappedValues = GetMappedDictionary();
for (int i = start, j = 0; i <= end; ++i, ++j)
{
var a = mappedValues[(line)[i]];
var b = _weights[j % 3];
sum += a *b;
}
return sum;
}
private static bool MrzCheckValidty(string line, int start, int end,int indexDigit)
{
int weight = MrzComputeWeight(line, start, end);
return (weight % 10) == Int32.Parse(line.Substring(indexDigit, 1));
}现在,它适用于所有测试示例,但不适用于
IDUTOBE01124128TEST1234V<<<<<<
这里的文档id是BE0112412,当我计算它时,它给了我4作为结果,但是在mrz中检查数字是8。这个mrz是真实的mrz所以8必须是正确的。为什么这不适用于这个MRZ,即使它对其他我尝试过的人也有效?
提前感谢
发布于 2021-07-28 03:50:03
我检查你的箱子,当你有字母O时它给了4,当你有数字时它给了4。
下面是完整的python代码checkdigit.py
#!/usr/bin/python3
import sys
def getcharvalue(c):
if c >= '0' and c <= '9':
return ord(c) - ord('0')
if c >= 'A' and c <= 'Z':
return ord(c) - ord('A') + 10
if c == '<':
return 0
def calc_checkdigit(data):
multipliers = [7, 3, 1]
s = 0
for idx,digit in enumerate(data):
n = getcharvalue(digit) * multipliers[idx % len(multipliers)]
s += n
cdigit = s % 10
return cdigit
data = sys.argv[1]
cdigit = calc_checkdigit(data)
print(cdigit)测试运行:
./checkdigit.py "BEO112412" # this prints 8
./checkdigit.py "BE0112412" # this prints 4https://stackoverflow.com/questions/68276919
复制相似问题