随笔杂谈之EAN-UCC条形码

背景

UCC/EAN-128用于商品的物流环节,非定长,用AI加数据的方式表示商品更多的辅助信息。UCC/EAN-128是code-128码的一个子集,在起始符后紧跟一个FNC1以区别于普通的CODE-128条码。
UCC/EAN-128对应于GB/T 15425-2002《 EAN.UCC系统 128条码》。相关规范不能上传,需要的同学可以站内私信。

本文源码工程文件见https://download.csdn.net/download/Lapedius/14041796

技术实现

数据组成

const unsigned short leftMargin = 0x00;//固定值
const unsigned short startSymbol = UCC_CharSetA[103];//START A固定值	
const unsigned short fncSymbol = UCC_CharSetA[102];//FNC1 固定值	
unsigned short dataSymbol[16];	
unsigned short checkSymbol;	
const unsigned short endSymbol = 0x18EB;//STOP固定值	
const unsigned short rightMargin = 0x00;//固定值

UCC/EAN-128条码由上述7部分组成,分别是左空白区、起始符、FNC1、数据符、校验符、结束符和右空白区组成。每个区域的含义可以查看GB/T 15425相关章节。其中,左空白区、起始符、FNC1、结束符和右空白区可以认为是固定值,或者只有有限的几种选择。我们主要做的内容是对数据进行编码和计算校验符。

生成待编码数据

//生成随机数作为barcode	
BYTE randomCode[8];
srand((unsigned int)time(NULL));	
for (index = 0; index < 8; index++)	{		
randomCode[index] = rand() & 0xFF;	
}	//随机数转换为字符串,大写字母和数字混合	
char sampleBarCode[32] = { 0 };	
convertByteArrayToHexStr(randomCode, 8, (BYTE*)sampleBarCode);	
BYTE barCodeLen = 16;
CString str = _T("条码值:");	
str += CA2T(sampleBarCode);

UCC/EAN-128条码支持大写字母、小写字母、数字、特殊字符等编码。我们的例子只支持大写字母和数字混编,因此只实现了字符集A。这里是通过生成随机数,并转换为HEX形式,作为待编码的原始数据。

对数据编码

for (index = 0; index < barCodeLen; index++)	
{				
	if (sampleBarCode[index]>= '0' && sampleBarCode[index] <= '9')//number		
	{			
		dataSymbol[index] = UCC_CharSetA[sampleBarCode[index] - '0' + 16];		
	}		
	else if (sampleBarCode[index] >= 'A' && sampleBarCode[index] <= 'Z')//character		
	{			
		dataSymbol[index] = UCC_CharSetA[sampleBarCode[index] - 'A' + 33];		
	}		
	else//not support		
	{			
		MessageBox(_T("暂时不支持!"));			
		return;		
	}			
}

参照字符集A对大写字母和数据进行混合编码。字符集A见代码工程。

计算校验符

BYTE weight[32] = {1};	
for (index = 1; index < 32; index++)	
{		
weight[index] = index;	
}	
WORD sum = 0; 	
sum = 103 * weight[0] + 102 * weight[1];//暂时只支持startA	
for (index = 0; index < 16; index++)	
{		
	if (sampleBarCode[index] >= '0' && sampleBarCode[index] <= '9')//number		
	{			
		sum += weight[index + 2] * (sampleBarCode[index] - '0' + 16);	
	}	
	else if (sampleBarCode[index] >= 'A' && sampleBarCode[index] <= 'Z')//character		
	{			
		sum += weight[index + 2] * (sampleBarCode[index] - 'A' + 33);		
	}		
	else//not support		
	{			
		MessageBox(_T("暂时不支持!"));			
		return;		
	}			
}	
checkSymbol = UCC_CharSetA[sum % 103];

校验符的计算原理见标准的附录C。

显示

工程中剩下的代码作用是将数据转化为比特数组,最终在界面上显示。本例工程运行后点击左键显示结果如下所示。使用条码扫描软件可以识别。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VBA是一种用于Microsoft Office应用程序的编程语言,可以用于处理和操作Excel、Access、Word等文档和数据。而EAN-13条码(European Article Number 13)是一种全球通用的商品条码编码系统,用于唯一标识和跟踪商品。 在VBA中,可以使用一些内置的函数和方法来处理和生成EAN-13条码。下面是一个简单的示例: 首先,我们需要在Excel中创建一个单元格,用于输入要生成条码的商品编号。然后,在VBA代码中,可以使用如下函数来生成EAN-13条码: ```vba Function GenerateEAN13Barcode(ByVal productCode As String) As String Dim checkDigit As Integer Dim encodedDigits As String ' 检查输入的商品编号是否为12位数字 If Not IsNumeric(productCode) Or Len(productCode) <> 12 Then GenerateEAN13Barcode = "输入的商品编号无效!" Exit Function End If ' 计算校验位 checkDigit = CalculateEAN13CheckDigit(productCode) ' 编码商品编号和校验位 encodedDigits = productCode & checkDigit GenerateEAN13Barcode = encodedDigits End Function Function CalculateEAN13CheckDigit(ByVal code As String) As Integer Dim i As Integer Dim digit As Integer Dim total As Integer ' 遍历商品编号的每一位数字 For i = 1 To 12 digit = Mid(code, i, 1) ' 偶数位数字乘以3,奇数位数字乘以1 If i Mod 2 = 0 Then total = total + digit * 3 Else total = total + digit End If Next i ' 计算校验位 CalculateEAN13CheckDigit = (10 - total Mod 10) Mod 10 End Function ``` 以上代码中,`GenerateEAN13Barcode`函数会接收一个12位的商品编号,并根据校验位计算生成13位的EAN-13条码。`CalculateEAN13CheckDigit`函数用于计算校验位。 在Excel的单元格中,可以使用VBA的`=GenerateEAN13Barcode(A1)`函数来生成EAN-13条码,其中A1为输入的商品编号单元格。执行该函数后,会在相应的单元格中显示生成的EAN-13条码。 通过以上的VBA代码,我们可以在Excel中使用VBA函数来生成EAN-13条码,方便实现商品条码的生成和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值