随笔杂谈之EAN-13条形码
EAN-13条形码
- 背景
- 技术实现
- 数据组成
- 生成待编码数据
- 对数据编码
- 计算校验符
- 显示
背景
EAN码(英文全称:European Article Number)由前缀码、厂商识别码、商品项目代码和校验码组成。前缀码是国际EAN组织标识各会员组织的代码,我国为690-699;厂商代码是EAN编码组织在EAN分配的前缀码的基础上分配给厂商的代码;商品项目代码由厂商自行编码;校验码为了校验代码的正确性。在编制商品项目代码时,厂商必须遵守商品编码的基本原则:对同一商品项目的商品必须编制相同的商品项目代码;对不同的商品项目必须编制不同的商品项目代码。保证商品项目与其标识代码一一对应,即一个商品项目只有一个代码,一个代码只标识一个商品项目.我国的通用商品条码与其等效。我们日常购买的商品包装上所印的条码一般就是EAN码。另外,图书和期刊作为特殊的商品也采用了EAN13表示ISBN和ISSN。前缀977被用于期刊号ISSN,图书号ISBN用978为前缀,我国被分配使用7开头的ISBN号,因此我国出版社出版的图书上的条码全部为9787开头。
EAN-13码对应于GB 12904-2008《 商品条码 零售商品编码与条码表示》。相关规范不能上传,需要的同学可以站内私信。
本文源码工程文件见https://download.csdn.net/download/Lapedius/14041796
技术实现
数据组成
//1代表黑色,0代表白色
BYTE leftMargin[11] = {0};
BYTE startSymbol[3] = {1,0,1};//固定值
BYTE leftDataSymbol[42] = {0};
BYTE seperateSymbol[5] = {0,1,0,1,0};//固定值
BYTE rightDataSymbol[35] = {0};
BYTE checkDataSymbol[7] = {0};
BYTE endSymbol[3] = {1,0,1};//固定值
BYTE rightMargin[7] = {0};
EAN-13条码由上述8部分组成,分别是左空白区、起始符、左侧数据符、分隔符、右侧数据符、校验符、结束符和右空白区组成。每个区域的含义可以查看GB 12904相关章节。其中,左空白区、起始符、seperateSymbol、结束符和右空白区可以认为是固定值,或者只有有限的几种选择。我们主要做的内容是对数据进行编码和计算校验符。
生成待编码数据
char* sampleBarCode = "6920858266547";
EAN-13条码一般只支持阿拉伯数字编码。并且很多代码都可能有自己的含义,受中国物品编码中心分配和管理。
对数据编码
memcpy(leftDataSymbol + 0, EAN_UPC_A_SubSet[barCode[1]], 7);//12位
adjustAsASubset(leftDataSymbol + 0, barCode[1]);
memcpy(leftDataSymbol + 7, EAN_UPC_B_SubSet[barCode[2]], 7);//11位
adjustAsBCSubset(leftDataSymbol + 7, barCode[2]);
memcpy(leftDataSymbol + 14, EAN_UPC_B_SubSet[barCode[3]], 7);//10位
adjustAsBCSubset(leftDataSymbol + 14, barCode[3]);
memcpy(leftDataSymbol + 21, EAN_UPC_B_SubSet[barCode[4]], 7);//9位
adjustAsBCSubset(leftDataSymbol + 21, barCode[4]);
memcpy(leftDataSymbol + 28, EAN_UPC_A_SubSet[barCode[5]], 7);//8位
adjustAsASubset(leftDataSymbol + 28, barCode[5]);
memcpy(leftDataSymbol + 35, EAN_UPC_A_SubSet[barCode[6]], 7);//7位
adjustAsASubset(leftDataSymbol + 35, barCode[6]);
对于中国境内的编码(6开头),其每个数字编码对应的字符集已经确定,从12到7位分别对应ABBBAA。字符集A和B见代码工程。
memcpy(rightDataSymbol + 0, EAN_UPC_C_SubSet[barCode[7]], 7);//6位
adjustAsBCSubset(rightDataSymbol + 0, barCode[7]);
memcpy(rightDataSymbol + 7, EAN_UPC_C_SubSet[barCode[8]], 7);//5位
adjustAsBCSubset(rightDataSymbol + 7, barCode[8]);
memcpy(rightDataSymbol + 14, EAN_UPC_C_SubSet[barCode[9]], 7);//4位
adjustAsBCSubset(rightDataSymbol + 14, barCode[9]);
memcpy(rightDataSymbol + 21, EAN_UPC_C_SubSet[barCode[10]], 7);//3位
adjustAsBCSubset(rightDataSymbol + 21, barCode[10]);
memcpy(rightDataSymbol + 28, EAN_UPC_C_SubSet[barCode[11]], 7);//2位
adjustAsBCSubset(rightDataSymbol + 28, barCode[11]);
右侧数据统一按照字符集C进行编码。
计算校验符
//校验位
BYTE evenSum = barCode[1] + barCode[3] + barCode[5] + barCode[7] + barCode[9] + barCode[11];
BYTE oddSum = barCode[0] + barCode[2] + barCode[4] + barCode[6] + barCode[8] + barCode[10];
BYTE modResult = 10 - (evenSum * 3 + oddSum) % 10;
memcpy(checkDataSymbol, EAN_UPC_C_SubSet[modResult], 7);//1位
校验符的计算原理见标准的附录B。
显示
BYTE EAN13BarCode[113] = {0};
memcpy(EAN13BarCode + 0, leftMargin, 11);
memcpy(EAN13BarCode + 11, startSymbol, 3);
memcpy(EAN13BarCode + 14, leftDataSymbol, 42);
memcpy(EAN13BarCode + 56, seperateSymbol, 5);
memcpy(EAN13BarCode + 61, rightDataSymbol, 35);
memcpy(EAN13BarCode + 96, checkDataSymbol, 7);
memcpy(EAN13BarCode + 103, endSymbol, 3);
memcpy(EAN13BarCode + 106, rightMargin, 7);
上面是对数据进行组合。
工程中剩下的代码作用是将数据(比特数组)在界面上显示。本例工程运行后点击右键显示结果如下所示。使用条码扫描软件可以识别。
随笔杂谈之EAN-13条形码相关推荐
- 如何将EAN 13码批量输出成图片
EAN是标准条形码,目前商店里大多数商品上都打有此码.EAN广泛用于便利店里的POS系统中.由于EAN和美国.加拿大的UPC,日本的JAN兼容,是世界通用的条形码.EAN13码是由前缀码.厂商识别码. ...
- 一维码EAN 13简介及其解码实现(zxing-cpp)
一维码EAN 13:属于国际标准条码, 由13个数字组成,为EAN的标准编码型式(EAN标准码). 依结构的不同,EAN条码可区分为: 1. EAN 13码: 由13个数字组成,为EAN的标准编码型 ...
- 条码软件如何批量制作A级EAN 13条码
打开中琅条码软件,在文档设置窗口,点击"纸张"选项卡,纸张下拉选项选择"自定义大小",然后设置纸张尺寸. 然后选择"布局"选项卡,手工设置一 ...
- Golang 随笔杂谈
最近我迷上了Rust语言和区块链,作为C++入行的我还是很难接受GC类语言,C++程序员对于性能效率有着本能地渴望和追求!但是C++却又过于复杂,令程序员的心智负担过重!而Rust语言的优雅和效率令我 ...
- 21年年后离职找工作的随笔杂谈
目录标题 前言 忙碌而又焦虑的面试阶段 个人反思 前言 21年,向上司提了离职流程,从学校毕业也三年半了,并且在厦门这座城市也三年多了,厦门这座城市也是着实令人无奈,宜居是宜居,可惜不对年轻人. 当前 ...
- 中秋之夜——随笔杂谈
前言 ~~~~~~~~ 灯火辉煌的中秋,突然袭来了一阵寒流.今年的中秋,显得格外的冷,寒气逼人.无意间打开了自己的CSDN博客,发现距离我写第一篇博客刚好一年了.时间静静流淌,完全不留 ...
- 随笔杂谈(二)——我的三年CSDN博客
第一次写CSDN博客到现在已经过去三年了,不知不觉就写了三年,发表了180多篇文章. 记得刚开始写只是为了记录开发过程中遇到的各种坑,等以后遇到后能快速查阅,现在看来都是一些十分低级的bug. 刚开始 ...
- 随笔杂谈2022-02-07
打工人的基本素质 1:团队精神和协作能力 打工人最重要的安身立命之本.个人的力量是有限的,需要组成强大的团队. 2:文档习惯 缺乏文档,在查错.升级.及模块的复用会麻烦.良好的文档是正规 ...
- IQVIA医药咨询随笔杂谈
艾昆纬IQVIA是由Quintiles(昆泰)和IMS Health于2016年10月合并的一家美国跨国公司,当时取名为QuintilesIMS.于2017年11月更名为IQVIA.主要服务于健康信息 ...
最新文章
- hadoop集群运维碰到的问题汇总
- oracle误删scott文件如何恢复
- 深入浅出计算机组成原理学习笔记:总线-计算机内部的高速公路(第42讲)
- 安全体系结构与七个设计原则
- The following profiles are active: dev
- LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)
- c3p0 服务启动获取连接超时_微服务架构中的熔断、降级
- Android 系统(132)---ODM 开发用户常见需求文档(六)
- 各种排序算法稳定性的总结!!!
- java 方法体 out 参数_Java方法详解
- ASP.NET-第五天-HTML基础
- React:创建用于获取数据的自定义Hook
- android真实项目教程(五)——有时三点两点雨_by_CJJ
- 机器学习与数据挖掘_Regularization
- 计算机技术能力校本培训总结,信息技术校本培训总结
- 【翻译论文】A Progressive Morphological Filter for Removing Nonground Measurements From Airborne LIDAR Dat
- manifestintert-filter详解
- MT6763 N1 色温模式功能的实现,手动调节色温。
- macd 公式 java_EMA指标和MACD指标的JAVA语言实现 | 学步园
- JVM之类的加载过程(三):初始化——>Initialization
热门文章
- 19.1 Python入门之爬虫
- 工作八年,月薪60K,裸辞两个月,投简历投到怀疑人生!
- 好口才是练出来的:练胆量、练技巧、练修养
- 【NOI2005】 瑰丽华尔兹
- java+python+nodejs设备配件采购报修进销存管理系统
- 建立学习型组织:Scrum和Kanban殊途同归
- 如何成为一名优秀的前端开发人员?初到公司到融入公司,这些事情你需要知道!
- 疾风之刃鸿蒙炸裂,疾风之刃二周年版本更新内容一览 疾风之刃二周年版本更新内容详解...
- 软件开发项目中的成本比例
- Hbuilder打包app---kalrry