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 として計算される場合があります。この場合、バーコードで使用するチェック ディジットとして、右端の数字 0 を使用します。

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;
    }

(おそらくCode Dieselでの Sameer Borate の作品から引用)

注: このコードは以前の投稿者のコメントに基づいていますが、このコードは実際には異なります。Toll は upc の奇数の合計を計算します。このコードは、質問に対して 100% 正しく答えます。

于 2014-05-22T02:58:39.300 に答える
0

この回答は約 2 年遅れていますが、Toll Priority の 20 桁の Code128 バーコードの TollConnect チェック ディジットを正しく生成する、私が思いついた PHP 関数です。

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 に答える