1

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

信息和代码:

奥里尼奥;类型 = 字符串。描述:任何长度的条形码字符串,不包括最后一个位置的校验位。示例: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。在这种情况下,取最右边的数字零作为条形码中使用的校验位。

4

3 回答 3

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% 正确地回答了这个问题。

于 2014-05-22T02:58:39.300 回答
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 的模数

这就是 UPC-A 校验位的计算方式(根据上面的链接)。

现在唯一奇怪的是UPC-A不支持字符-据我所知只有数字-所以我不确定为什么需要将非数字映射到数字范围(这就是else块正在做的事情)。

于 2013-09-24T03:41:39.167 回答
0

这个答案晚了大约 2 年,但这是我想出的 PHP 函数,它将正确地为 Toll Priority 20 位 Code128 条形码生成一个 TollConnect 校验位。

function generateTollCheckDigit($barcode){
    $productNo  = 0;
    $multiplier = 3;

    $barcodeArr = str_split(strrev($barcode));

    foreach($barcodeArr as $char){

        if(is_numeric($char)){
            $digit = $char;
        }else{
            $digit = ord(strtoupper($char)) - ord('A');
        }

        $productNo += $digit * $multiplier;

        $multiplier = $multiplier == 3 ? 1 : 3;
    }

    $checkdigit = 10 - ($productNo % 10);

    return $checkdigit == 10 ? 0 : $checkdigit;
}
于 2016-02-04T05:31:19.337 回答