39码 128B码解决方案
39码可以直接用字体代替,来字符前后都加下“*”,即可被条码枪识别。
128B码的话,用字体加算法的方法才行,要计算开始位、校验位、结束位。
VBA计算方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Function code128b(Tar As Range) '128B码:ChrW(204). 2 Dim s$, i%, ss$, j%, curR%, checkB% 3 curR = Tar.Row 4 s = Tar.Value 5 checkB = 1 '开始位的码值为104 mod 103 =1 6 For i = 1 To Len(s) 7 ss = Mid(s, i, 1) 8 j = Asc(ss) '不过滤无效字符,比如汉字. 9 If j < 135 Then 10 j = j - 32 11 ElseIf j > 134 Then 12 j = j - 100 13 End If 14 checkB = (checkB + i * j) Mod 103 '计算校验位 15 Next 16 If checkB < 95 And checkB > 0 Then '有的资料直接求103的模,解说不充分,因为有的校验位超过127时,系统会"吃"掉它们(连带休止符). 17 checkB = checkB + 32 18 ElseIf checkB > 94 Then '字体设置时,字模被定义了2个值.观察字体文件时能发现. 19 checkB = checkB + 100 20 End If 21 code128b = ChrW(204) & s & IIf(checkB, ChrW(checkB), Chr(32)) & ChrW(206) 22 End Function
C#计算方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 private string Get128CodeString(string inputData) 2 { 3 string result; 4 int checksum = 104; 5 for (int ii = 0; ii < inputData.Length; ii++) 6 { 7 if (inputData[ii] >= 32) 8 { 9 checksum += (inputData[ii] - 32) * (ii + 1); 10 } 11 else 12 { 13 checksum += (inputData[ii] + 64) * (ii + 1); 14 } 15 } 16 checksum = checksum % 103; 17 if (checksum < 95) 18 { 19 checksum += 32; 20 } 21 else 22 { 23 checksum += 100; 24 } 25 result = Convert.ToChar(204) + inputData.ToString() + Convert.ToChar(checksum) + Convert.ToChar(206); 26 return result; 27 }