这是一个公认的校验和算法吗?

时间:2013-09-24 03:13:09

标签: barcode checksum

我必须计算一个20位条形码的校验位。我有一个包含一些伪代码的规范,但它看起来很讨厌。特别是有分工的部分。商。由于精度损失或舍入等原因导致失败的余地很大。我想知道这是否是一个公认的校验和,以便我可以使用经过测试的实现,最好是在c#或java中。

信息和代码:

ORIGNO; Type = String。描述:任何长度的条形码字符串,不包括最后位置的校验位。示例:21个字符的Toll Connect条形码字符串在最后(第21个)位置具有校验位。因此,ORIGNO将是21个字符Toll Connect条形码字符串的前20个字符。

PRODUCTNO = 0; type=integer
LENGTHNO = Length (ORIGNO)
MULTIPLIER=3
For LP = LENGTHNO to 1 step -1
  CHARTOCHECK=MID (ORIGNO,LP,1)
  IF isnumeric (CHARTOCHECK) then
    DIGIT = asc (CHARTOCHECK) - asc ('0')
  else
    DIGIT = rem ((asc (CHARTOCHECK)-asc ('A')) / 10)
  endif
  PRODUCTNO = PRODUCTNO + DIGIT*MULTIPLIER
  If MULTIPLIER=3 then MULTIPLIER=1 else MULTIPLIER=3 endif
end for

CHECK DIGITSTR=str (PRODUCTNO)
CHECK DIGIT=10-int (asc (right (CHECK DIGITSTR,1))-asc ('0'))

注意:此算法可能导致校验位计算为10.在这种情况下,将最右边的数字(零)作为条形码中使用的校验位。

3 个答案:

答案 0 :(得分:0)

这看起来有点像UPC-A校验位计算:

如果忽略IF isnumeric else块,则循环基本上执行此计算([x]表示位于x的数字,从右侧开始计数):

[1] * 3 + [2] + [3] * 3 + [4] + [5] * 3 ...

([1] + [3] + [5] + ...) * 3 + [2] + [4] + ...

相同

如此有效:

  1. 汇总奇数位置的所有数字并乘以3
  2. 汇总偶数位置的所有数字
  3. 构建步骤1和2的总和
  4. 获取第3步的模10(即right (CHECK DIGITSTR,1)基本上正在做的事)
  5. 减去10的模数
  6. 这是计算UPC-A校验位的方式(根据上面的链接)。

    现在唯一奇怪的是UPC-A不支持字符 - 只有我知道的数字 - 所以我不确定为什么你需要将非数字映射到数字范围(这就是阻止else阻止。

答案 1 :(得分:0)

需要编码的人的参考(下面的PHP代码)。

re:Toll Connect,Toll Check Digit算法。对于128B条形码符号系统 - 使用20位数的upc代码字符串+ 1个校验位= 21位数的条形码(也适用于较小的条形码)。

function generate_upc_checkdigit($upc_code){
        $odd_total  = 0;
        $even_total = 0;
        for($i=1; $i<strlen($upc_code); $i++) {
            if((($i)%2) == 0) {
                /* Sum even digits */
                $even_total += $upc_code[$i];
            } else {
                /* Sum odd digits */
                $odd_total += $upc_code[$i];
            }
        }
        $sum = (3 * $odd_total) + $even_total;
        $check_digit = $sum % 10;
        return ($check_digit > 0) ? 10 - $check_digit : $check_digit;
    }

(可能取自Sameer Borate在Code Diesel的工作)

注意:虽然此代码基于之前的海报评论,但此代码实际上是不同的。 Toll计算upc中奇数的总和,此代码专门100%正确回答问题。

答案 2 :(得分:0)

这个答案大约迟了2年,但这是我提出的PHP函数,它将正确生成TollConnect校验位,用于收费优先级20位Code128条码。

{{1}}