GS1标准定义了包含4或5位可变权重或价格的GTIN代码。此可变重量或价格部件需要使用校验数字进行验证。
我如何计算代码中的校验位?请注意,此校验位的计算方式与GTIN末尾的默认校验位不同。
供参考:https://www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf第466页/467
您没有指定所选的语言,所以希望这对您有用。从本质上讲,它可以归结为数组查找和简单的数学运算。这段代码是用AutoITScript编写的,但翻译成其他代码应该很简单。
我确信这段代码可以变得更智能(使用2d数组查找、函数等(,但为了简单起见,我让它更可读。
需要注意的是,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