我必须计算一个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.在这种情况下,将最右边的数字(零)作为条形码中使用的校验位。
答案 0 :(得分:0)
这看起来有点像UPC-A校验位计算:
如果忽略IF isnumeric else
块,则循环基本上执行此计算([x]
表示位于x
的数字,从右侧开始计数):
[1] * 3 + [2] + [3] * 3 + [4] + [5] * 3 ...
与([1] + [3] + [5] + ...) * 3 + [2] + [4] + ...
如此有效:
right (CHECK DIGITSTR,1)
基本上正在做的事)这是计算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}}