2013-09-24 23 views
1

我必須計算一個20位數的條形碼的校驗位。我有一個包含一些僞代碼的規範,但它看起來很討厭。特別是與部門&商。有很多範圍可能導致失敗,例如精度或舍入等。我想知道這是否是公認的校驗和,以便我可以使用經過測試的實現,最好在C#或Java中使用。這是一個公認的校驗和算法嗎?

信息和代碼:

ORIGNO; Type = String。說明:任何長度的條形碼字符串,不包括最後一個位置的校驗位。例如:一個21字符長途連接條碼字符串在最後(第21)位置有校驗位。因此,ORIGNO將是21個字符長途連接條形碼字符串的前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

這看起來有點像UPC-A校驗位的計算:(由從右側開始計數與[x]指示x位置位)

如果忽略IF isnumeric else塊則環路基本上執行此計算:

[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塊正在做)。

+0

謝謝克里斯。這必須是允許字母數字的UPC-A的修改版本。一個典型的條形碼是TNNNNAAAAAANNNNNNNNN,其中第一個AA是服務代碼,其餘AAAA是發送者標識符。一個例子是T20002ATEST000001001。條碼打印爲CODE128格式B.我創建了一個c#方法,我仍在測試。我正在等待來自Toll的一些確認的示例條形碼,然後才能發佈我的實施。 –

0

這是需要編碼的人的參考(下面的PHP代碼)。

re:收費連接,收費檢查數字算法。對於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; 
    } 

(在Code Diesel從薩米爾硼酸的工作可能採取的)

注:儘管此代碼是基於以前的海報發表評論,這段代碼實際上是不同的。收費計算upc中奇數的總和,並且該代碼專門正確地回答了100%的問題。

0

這個答案是晚了約2年,但這是我想出的PHP函數,將正確生成收費優先級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; 
}