首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c# MRZ TDI1校验数字与校验数字不匹配

c# MRZ TDI1校验数字与校验数字不匹配
EN

Stack Overflow用户
提问于 2021-07-06 20:16:52
回答 1查看 263关注 0票数 1

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

我从这个c#指南中写了链接代码来计算数字。我会比较一下。下面是我为c#编写的计算代码

代码语言:javascript
复制
        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,即使它对其他我尝试过的人也有效?

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-28 03:50:03

我检查你的箱子,当你有字母O时它给了4,当你有数字时它给了4

下面是完整的python代码checkdigit.py

代码语言:javascript
复制
#!/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)

测试运行:

代码语言:javascript
复制
./checkdigit.py "BEO112412" # this prints 8
./checkdigit.py "BE0112412" # this prints 4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68276919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档