GS1 标准定义了包含 4 或 5 位可变重量或价格的 GTIN 代码。此可变重量或价格部分需要使用校验位进行验证。
如何计算代码中的这个校验位?请注意,此校验位的计算方式与 GTIN 末尾的默认校验位不同。
供参考:https : //www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf 第 466/467 页
GS1 标准定义了包含 4 或 5 位可变重量或价格的 GTIN 代码。此可变重量或价格部分需要使用校验位进行验证。
如何计算代码中的这个校验位?请注意,此校验位的计算方式与 GTIN 末尾的默认校验位不同。
供参考:https : //www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf 第 466/467 页
您没有指定选择的语言,所以希望这对您有用。本质上,它可以归结为数组查找和简单的数学运算。这段代码是用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