1

GS1 标准定义了包含 4 或 5 位可变重量或价格的 GTIN 代码。此可变重量或价格部分需要使用校验位进行验证。

如何计算代码中的这个校验位?请注意,此校验位的计算方式与 GTIN 末尾的默认校验位不同。

供参考:https : //www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf 第 466/467 页

4

1 回答 1

2

您没有指定选择的语言,所以希望这对您有用。本质上,它可以归结为数组查找和简单的数学运算。这段代码是用AutoITScript编写的,但翻译给其他人应该很简单。

我确信这段代码可以变得更智能(使用二维数组查找、函数等),但为了简单起见,我让它更具可读性。

需要注意的是,AutoIT 不是一种类型化的语言,所以 1234 可以被视为一个数字和一个字符串。AutoIT 也用于 $var[index1][index2]访问基于 0 的数组值。

希望这对您有所帮助!如果是这样,请接受解决方案。

结果

============= barcode checksum variable length ================
https://www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf section 7.9.2
----------------------
Doing checksum on 4 digits: 2875
digit 1 is: 2 --> Check = 4
digit 2 is: 8 --> Check = 5
digit 3 is: 7 --> Check = 1
digit 4 is: 5 --> Check = 3
 ==> Sum is 39
 ==> CHECK DIGIT IS RIGHT-MOST DIGIT = 9
----------------------
Doing checksum on 5 digits: 14685
digit 1 is: 1 --> Check = 5
digit 2 is: 4 --> Check = 8
digit 3 is: 6 --> Check = 7
digit 4 is: 8 --> Check = 4
digit 5 is: 5 --> Check = 9
 ==> Sum is 33
 ==> CHECK DIGIT IS 40-sum =  7

编码

#include <String.au3>

; barcode checksum
; https://www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf section 7.9.2
;

ConsoleWrite("============= barcode checksum variable length ================" & @CRLF)
ConsoleWrite("https://www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf section 7.9.2" & @CRLF)

;                      index 0              index 1                index 2                index 3
;                     --- wf2- ----------   ---  wf3 -----------   --- wf5+  ----------   ---- wf5- ----------
Static $f[4][10] = [ [0,2,4,6,8,9,1,3,5,7], [0,3,6,9,2,5,8,1,4,7], [0,5,1,6,2,7,3,8,4,9], [0,5,9,4,8,3,7,2,6,1]   ]

;                              4 digit version   5 digit version
static $lookupTables[2][5] =[  [ 0, 0, 1, 3] ,  [ 2, 0, 3, 2, 0] ]

; ==================================
; show some examples
_calcit(2875)
_calcit(14685)


; -------------------- function to calculate digits
;
Func _calcit($thenumber)
    ; assume the length is correct here
    ; theNumber is now array [0] is left-most
    local $arrayNumber = _StringExplode($thenumber, "", 0)
    local $t  ; our lookup digit
    local $tSum ; summarized
    local $theversion = 0   ; 0 = 4 digit, 1 = 5 digits
    if StringLen($thenumber) = 4 then
            $theversion = 0
    else
            $theversion = 1
    endif

    ConsoleWrite("----------------------" & @CRLF)
    ConsoleWrite("Doing checksum on " & StringLen($thenumber) &  " digits: " & $thenumber & @CRLF)
    for $i = 0 to StringLen($thenumber)-1
        ConsoleWrite("digit " & $i+1 & " is: " & $arrayNumber[$i])
        ;lookup the number in our 2d array. Which row determined by the lookup table.
        $t = $f [$lookupTables[$theversion][$i]] [$arrayNumber[$i] ]
        ConsoleWrite(" --> Check = " & $t & @CRLF)
        $tSum = $tSum + $t
    Next

    if $theversion = 0 then
        $tSum = $tSum * 3
        ConsoleWrite(" ==> Sum is " & $tSum & @CRLF)
        ConsoleWrite(" ==> CHECK DIGIT IS RIGHT-MOST DIGIT = " & StringRight($tSum, 1) & @CRLF)
    else
        ConsoleWrite(" ==> Sum is " & $tSum & @CRLF)
        $tSum = 40-$tSum
        ConsoleWrite(" ==> CHECK DIGIT IS 40-sum =  " & StringRight($tSum, 1) & @CRLF)
    EndIf
EndFunc

于 2021-04-01T07:40:00.407 回答