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条形码相关推荐

  1. 如何将EAN 13码批量输出成图片

    EAN是标准条形码,目前商店里大多数商品上都打有此码.EAN广泛用于便利店里的POS系统中.由于EAN和美国.加拿大的UPC,日本的JAN兼容,是世界通用的条形码.EAN13码是由前缀码.厂商识别码. ...

  2. 一维码EAN 13简介及其解码实现(zxing-cpp)

    一维码EAN 13:属于国际标准条码, 由13个数字组成,为EAN的标准编码型式(EAN标准码). 依结构的不同,EAN条码可区分为: 1.  EAN 13码: 由13个数字组成,为EAN的标准编码型 ...

  3. 条码软件如何批量制作A级EAN 13条码

    打开中琅条码软件,在文档设置窗口,点击"纸张"选项卡,纸张下拉选项选择"自定义大小",然后设置纸张尺寸. 然后选择"布局"选项卡,手工设置一 ...

  4. Golang 随笔杂谈

    最近我迷上了Rust语言和区块链,作为C++入行的我还是很难接受GC类语言,C++程序员对于性能效率有着本能地渴望和追求!但是C++却又过于复杂,令程序员的心智负担过重!而Rust语言的优雅和效率令我 ...

  5. 21年年后离职找工作的随笔杂谈

    目录标题 前言 忙碌而又焦虑的面试阶段 个人反思 前言 21年,向上司提了离职流程,从学校毕业也三年半了,并且在厦门这座城市也三年多了,厦门这座城市也是着实令人无奈,宜居是宜居,可惜不对年轻人. 当前 ...

  6. 中秋之夜——随笔杂谈

    前言 ~~~~~~~~         灯火辉煌的中秋,突然袭来了一阵寒流.今年的中秋,显得格外的冷,寒气逼人.无意间打开了自己的CSDN博客,发现距离我写第一篇博客刚好一年了.时间静静流淌,完全不留 ...

  7. 随笔杂谈(二)——我的三年CSDN博客

    第一次写CSDN博客到现在已经过去三年了,不知不觉就写了三年,发表了180多篇文章. 记得刚开始写只是为了记录开发过程中遇到的各种坑,等以后遇到后能快速查阅,现在看来都是一些十分低级的bug. 刚开始 ...

  8. 随笔杂谈2022-02-07

    打工人的基本素质 1:团队精神和协作能力    打工人最重要的安身立命之本.个人的力量是有限的,需要组成强大的团队. 2:文档习惯     缺乏文档,在查错.升级.及模块的复用会麻烦.良好的文档是正规 ...

  9. IQVIA医药咨询随笔杂谈

    艾昆纬IQVIA是由Quintiles(昆泰)和IMS Health于2016年10月合并的一家美国跨国公司,当时取名为QuintilesIMS.于2017年11月更名为IQVIA.主要服务于健康信息 ...

最新文章

  1. hadoop集群运维碰到的问题汇总
  2. oracle误删scott文件如何恢复
  3. 深入浅出计算机组成原理学习笔记:总线-计算机内部的高速公路(第42讲)
  4. 安全体系结构与七个设计原则
  5. The following profiles are active: dev
  6. LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)
  7. c3p0 服务启动获取连接超时_微服务架构中的熔断、降级
  8. Android 系统(132)---ODM 开发用户常见需求文档(六)
  9. 各种排序算法稳定性的总结!!!
  10. java 方法体 out 参数_Java方法详解
  11. ASP.NET-第五天-HTML基础
  12. React:创建用于获取数据的自定义Hook
  13. android真实项目教程(五)——有时三点两点雨_by_CJJ
  14. 机器学习与数据挖掘_Regularization
  15. 计算机技术能力校本培训总结,信息技术校本培训总结
  16. 【翻译论文】A Progressive Morphological Filter for Removing Nonground Measurements From Airborne LIDAR Dat
  17. manifestintert-filter详解
  18. MT6763 N1 色温模式功能的实现,手动调节色温。
  19. macd 公式 java_EMA指标和MACD指标的JAVA语言实现 | 学步园
  20. JVM之类的加载过程(三):初始化——>Initialization

热门文章

  1. 19.1 Python入门之爬虫
  2. 工作八年,月薪60K,裸辞两个月,投简历投到怀疑人生!
  3. 好口才是练出来的:练胆量、练技巧、练修养
  4. 【NOI2005】 瑰丽华尔兹
  5. java+python+nodejs设备配件采购报修进销存管理系统
  6. 建立学习型组织:Scrum和Kanban殊途同归
  7. 如何成为一名优秀的前端开发人员?初到公司到融入公司,这些事情你需要知道!
  8. 疾风之刃鸿蒙炸裂,疾风之刃二周年版本更新内容一览 疾风之刃二周年版本更新内容详解...
  9. 软件开发项目中的成本比例
  10. Hbuilder打包app---kalrry