2021SC@SDUSC

目录

  • 一、SymbolInfo
  • 二、DefaultPlacement
  • 三、ErrorCorrection

前言:在上一篇博客中,分析了Zxing中Data Matrix的部分代码,主要解释了Data Matrix码encode是如何实现的;本篇着重对SymbolInfo、DefaultPlacement、ErrorCorrection三个类的代码及功能进行分析。


一、SymbolInfo

SymbolInfo是Data Matrix的符号信息表。
定义了如下信息表:

static final SymbolInfo[] PROD_SYMBOLS = {new SymbolInfo(false, 3, 5, 8, 8, 1),new SymbolInfo(false, 5, 7, 10, 10, 1),/*rect*/new SymbolInfo(true, 5, 7, 16, 6, 1),new SymbolInfo(false, 8, 10, 12, 12, 1),/*rect*/new SymbolInfo(true, 10, 11, 14, 6, 2),new SymbolInfo(false, 12, 12, 14, 14, 1),/*rect*/new SymbolInfo(true, 16, 14, 24, 10, 1),new SymbolInfo(false, 18, 14, 16, 16, 1),new SymbolInfo(false, 22, 18, 18, 18, 1),/*rect*/new SymbolInfo(true, 22, 18, 16, 10, 2),new SymbolInfo(false, 30, 20, 20, 20, 1),/*rect*/new SymbolInfo(true, 32, 24, 16, 14, 2),new SymbolInfo(false, 36, 24, 22, 22, 1),new SymbolInfo(false, 44, 28, 24, 24, 1),/*rect*/new SymbolInfo(true, 49, 28, 22, 14, 2),new SymbolInfo(false, 62, 36, 14, 14, 4),new SymbolInfo(false, 86, 42, 16, 16, 4),new SymbolInfo(false, 114, 48, 18, 18, 4),new SymbolInfo(false, 144, 56, 20, 20, 4),new SymbolInfo(false, 174, 68, 22, 22, 4),new SymbolInfo(false, 204, 84, 24, 24, 4, 102, 42),new SymbolInfo(false, 280, 112, 14, 14, 16, 140, 56),new SymbolInfo(false, 368, 144, 16, 16, 16, 92, 36),new SymbolInfo(false, 456, 192, 18, 18, 16, 114, 48),new SymbolInfo(false, 576, 224, 20, 20, 16, 144, 56),new SymbolInfo(false, 696, 272, 22, 22, 16, 174, 68),new SymbolInfo(false, 816, 336, 24, 24, 16, 136, 56),new SymbolInfo(false, 1050, 408, 18, 18, 36, 175, 68),new SymbolInfo(false, 1304, 496, 20, 20, 36, 163, 62),new DataMatrixSymbolInfo144(),};

并且有如下lookup方法:

public static SymbolInfo lookup(int dataCodewords,SymbolShapeHint shape,Dimension minSize,Dimension maxSize,boolean fail) {for (SymbolInfo symbol : symbols) {if (shape == SymbolShapeHint.FORCE_SQUARE && symbol.rectangular) {continue;}if (shape == SymbolShapeHint.FORCE_RECTANGLE && !symbol.rectangular) {continue;}if (minSize != null&& (symbol.getSymbolWidth() < minSize.getWidth()|| symbol.getSymbolHeight() < minSize.getHeight())) {continue;}if (maxSize != null&& (symbol.getSymbolWidth() > maxSize.getWidth()|| symbol.getSymbolHeight() > maxSize.getHeight())) {continue;}if (dataCodewords <= symbol.dataCapacity) {return symbol;}}if (fail) {throw new IllegalArgumentException("Can't find a symbol arrangement that matches the message. Data codewords: "+ dataCodewords);}return null;}

二、DefaultPlacement

DefaultPlacement符号字符放置程序。
重点是如下放置方法:首先,反复地先检查一个特殊的角落案例;
沿对角线向上扫掠,插入连续字符;
然后沿对角线向下扫掠,插入连续字符,直到扫描整个阵列;
最后,如果右下角未触及,则填充固定图案。

  public final void place() {int pos = 0;int row = 4;int col = 0;do {// 反复地先检查一个特殊的角落案例if ((row == numrows) && (col == 0)) {corner1(pos++);}if ((row == numrows - 2) && (col == 0) && ((numcols % 4) != 0)) {corner2(pos++);}if ((row == numrows - 2) && (col == 0) && (numcols % 8 == 4)) {corner3(pos++);}if ((row == numrows + 4) && (col == 2) && ((numcols % 8) == 0)) {corner4(pos++);}// 沿对角线向上扫掠,插入连续字符do {if ((row < numrows) && (col >= 0) && noBit(col, row)) {utah(row, col, pos++);}row -= 2;col += 2;} while (row >= 0 && (col < numcols));row++;col += 3;// 然后沿对角线向下扫掠,插入连续字符do {if ((row >= 0) && (col < numcols) && noBit(col, row)) {utah(row, col, pos++);}row += 2;col -= 2;} while ((row < numrows) && (col >= 0));row += 3;col++;// 直到扫描整个阵列} while ((row < numrows) || (col < numcols));// 最后,如果右下角未触及,则填充固定图案if (noBit(numcols - 1, numrows - 1)) {setBit(numcols - 1, numrows - 1, true);setBit(numcols - 2, numrows - 2, true);}}

三、ErrorCorrection

ECC200的纠错码。
DataMatrix ECC200采用Reed-Solomon纠错编码来为其提供纠错能力。RS编码的目标是计算出纠错码字,参考表来确定纠错码字的长度,考虑数据码字:66 67 68 69 70 142 129 56(“ABCDE12”通过ASCII编码),长度为8,则纠错码字长度为10,表示为RS(n,k)=RS(18, 8)。
设C(x)为数据码 ,
E(x)为纠错码字 ,G(x)为生成多项式,则:


由RS检验码生成多项式的一般形式为:

则有:

X分别取值 ,得到方程组:

然后用通过高斯消除法计算出E(x)={75 145 55 46 20 95 253 237 62 111},最终生成18位码字{66 67 68 69 70 142 129 56 75 145 55 46 20 95 253 237 62 111}。

相关代码为:

  // 查找表要使用哪些因子来表示多少个纠错码字。private static final int[] FACTOR_SETS= {5, 7, 10, 11, 12, 14, 18, 20, 24, 28, 36, 42, 48, 56, 62, 68};// ECC 200的预计算多项式因子。private static final int[][] FACTORS = {{228, 48, 15, 111, 62},{23, 68, 144, 134, 240, 92, 254},{28, 24, 185, 166, 223, 248, 116, 255, 110, 61},{175, 138, 205, 12, 194, 168, 39, 245, 60, 97, 120},{41, 153, 158, 91, 61, 42, 142, 213, 97, 178, 100, 242},{156, 97, 192, 252, 95, 9, 157, 119, 138, 45, 18, 186, 83, 185},{83, 195, 100, 39, 188, 75, 66, 61, 241, 213, 109, 129, 94, 254, 225, 48, 90, 188},{15, 195, 244, 9, 233, 71, 168, 2, 188, 160, 153, 145, 253, 79, 108, 82, 27, 174, 186, 172},{52, 190, 88, 205, 109, 39, 176, 21, 155, 197, 251, 223, 155, 21, 5, 172,254, 124, 12, 181, 184, 96, 50, 193},{211, 231, 43, 97, 71, 96, 103, 174, 37, 151, 170, 53, 75, 34, 249, 121,17, 138, 110, 213, 141, 136, 120, 151, 233, 168, 93, 255},{245, 127, 242, 218, 130, 250, 162, 181, 102, 120, 84, 179, 220, 251, 80, 182,229, 18, 2, 4, 68, 33, 101, 137, 95, 119, 115, 44, 175, 184, 59, 25,225, 98, 81, 112},{77, 193, 137, 31, 19, 38, 22, 153, 247, 105, 122, 2, 245, 133, 242, 8,175, 95, 100, 9, 167, 105, 214, 111, 57, 121, 21, 1, 253, 57, 54, 101,248, 202, 69, 50, 150, 177, 226, 5, 9, 5},{245, 132, 172, 223, 96, 32, 117, 22, 238, 133, 238, 231, 205, 188, 237, 87,191, 106, 16, 147, 118, 23, 37, 90, 170, 205, 131, 88, 120, 100, 66, 138,186, 240, 82, 44, 176, 87, 187, 147, 160, 175, 69, 213, 92, 253, 225, 19},{175, 9, 223, 238, 12, 17, 220, 208, 100, 29, 175, 170, 230, 192, 215, 235,150, 159, 36, 223, 38, 200, 132, 54, 228, 146, 218, 234, 117, 203, 29, 232,144, 238, 22, 150, 201, 117, 62, 207, 164, 13, 137, 245, 127, 67, 247, 28,155, 43, 203, 107, 233, 53, 143, 46},{242, 93, 169, 50, 144, 210, 39, 118, 202, 188, 201, 189, 143, 108, 196, 37,185, 112, 134, 230, 245, 63, 197, 190, 250, 106, 185, 221, 175, 64, 114, 71,161, 44, 147, 6, 27, 218, 51, 63, 87, 10, 40, 130, 188, 17, 163, 31,176, 170, 4, 107, 232, 7, 94, 166, 224, 124, 86, 47, 11, 204},{220, 228, 173, 89, 251, 149, 159, 56, 89, 33, 147, 244, 154, 36, 73, 127,213, 136, 248, 180, 234, 197, 158, 177, 68, 122, 93, 213, 15, 160, 227, 236,66, 139, 153, 185, 202, 167, 179, 25, 220, 232, 96, 210, 231, 136, 223, 239,181, 241, 59, 52, 172, 25, 49, 232, 211, 189, 64, 54, 108, 153, 132, 63,96, 103, 82, 186}};
   // 为编码消息创建ECC200错误更正。// codewords  码字// symbolInfo 有关要编码的符号的信息// 返回交错纠错的码字。public static String encodeECC200(String codewords, SymbolInfo symbolInfo) {if (codewords.length() != symbolInfo.getDataCapacity()) {throw new IllegalArgumentException("The number of codewords does not match the selected symbol");}StringBuilder sb = new StringBuilder(symbolInfo.getDataCapacity() + symbolInfo.getErrorCodewords());sb.append(codewords);int blockCount = symbolInfo.getInterleavedBlockCount();if (blockCount == 1) {String ecc = createECCBlock(codewords, symbolInfo.getErrorCodewords());sb.append(ecc);} else {sb.setLength(sb.capacity());int[] dataSizes = new int[blockCount];int[] errorSizes = new int[blockCount];for (int i = 0; i < blockCount; i++) {dataSizes[i] = symbolInfo.getDataLengthForInterleavedBlock(i + 1);errorSizes[i] = symbolInfo.getErrorLengthForInterleavedBlock(i + 1);}for (int block = 0; block < blockCount; block++) {StringBuilder temp = new StringBuilder(dataSizes[block]);for (int d = block; d < symbolInfo.getDataCapacity(); d += blockCount) {temp.append(codewords.charAt(d));}String ecc = createECCBlock(temp.toString(), errorSizes[block]);int pos = 0;for (int e = block; e < errorSizes[block] * blockCount; e += blockCount) {sb.setCharAt(symbolInfo.getDataCapacity() + e, ecc.charAt(pos++));}}}return sb.toString();}

2021SC@SDUSC Zxing开源代码(十)Data Matrix二维码(三)相关推荐

  1. Data Matrix 二维码解码库 libdmtx 编译方法

    Data Matrix 二维码解码库 libdmtx 编译方法 libdmtx 是一个开源的 Data Matrix 编解码库.项目主页在:https://github.com/dmtx 这里简单记录 ...

  2. 基于机器视觉的Data Matrix二维码识别

    基于机器视觉的Data Matrix二维码识别 二维码识别,这个在视觉应用中占有很重要的比例,各种各样的二维码都有可能需要识别.常见的QR码.Data Matrix码.本方案是识别Data Matri ...

  3. 2021SC@SDUSC Zxing开源代码(二)CaptureActivity代码分析-生命周期函数

    文章目录 前言 一.Android基础知识 1. Android 基本组件 2. SurfaceView .Surface与SurfaceHolder 3. Activity 生命周期 4. Andr ...

  4. 2021SC@SDUSC Zxing开源代码(十七)Zxing代码解析——一维码

    2021SC@SDUSC 目录 Code 39 Code 93 Code 128 Codabar ITF 参考资料 前言:本篇博客主要介绍一维码. Code 39 Code39是条形码的一种,也被称为 ...

  5. Zxing图片识别 从相册选二维码图片解析总结

    Zxing图片识别 从相册选取二维码图片进行解析总结 在Zxing扫描识别和图片识别的解析对象是相同的 本文分三个步骤: 1 获取相册的照片 2 解析二维码图片 3 返回结果 1) 获取相册照片 go ...

  6. C# 利用ZXing.Net来生成条形码和二维码

    本文是利用ZXing.Net在WinForm中生成条形码,二维码的小例子,仅供学习分享使用,如有不足之处,还请指正. 什么是ZXing.Net? ZXing是一个开放源码的,用Java实现的多种格式的 ...

  7. Android 基于google Zxing实现对手机中的二维码进行扫描

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/14450809 我之前写了一篇关于google Zxing扫描二维码的文章,效果是仿微信 ...

  8. 开发一个基于ZXing库以及安卓Studio的二维码扫描小程序(二)

    开发一个基于ZXing库以及安卓Studio的二维码扫描小程序(二) 下面我们做一个ZXing扫描二维码的例子,是通过安卓库的方式引用ZXing应用代码. 开发步骤 建立一个安卓工程(Project) ...

  9. 【QR Code Generator】开源免费响应式QRcdr二维码生成网站源码

    介绍: 开源免费响应式QRcdr二维码,一款基于PHP编写的二维码在线生成系统,只需点击几下就可以生成您的个人二维码,上传您的徽标或水印,选择自定义颜色,生成多种类型,选择一个图案并下载最终的二维码图 ...

  10. 用11行Python代码,实现动态二维码制作

    用11行Python代码,实现动态二维码制作 效果展示 Python实现 素材 其他工具 效果展示 Python实现 要预装myqr模块才行. windows键+R 打开cmd,输入pip insta ...

最新文章

  1. python property理解
  2. FileChannel与ByteBuffer的使用示例
  3. 半夜三点,去医院看病。。。
  4. node.js https 模块设置请求头等信息
  5. 耗时两个礼拜,8000字安卓面试长文,建议收藏
  6. ORA-01861: 文字与格式字符串不匹配
  7. synchronized的使用和底层原理、锁状态的膨胀升级过程
  8. 【数据分析】你一定要掌握的Python七种数据清洗方法
  9. 关于基类和子类构造函数的问题
  10. php mysql odbc_使用PHP和MySQL专用接口以及ODBC接口
  11. Gspace简介 | 华为手机如何简单使用谷歌服务
  12. android 7.0 8.0 9.0 10.0修改默认输入法为谷歌输入法(RK MTK 展讯等平台都适用)
  13. 虚拟服务器 emule,emule服务器
  14. uni-app实现微信相机
  15. FLUENT中VOF模型的仿真流程
  16. wind(万得)资讯金融终端登录失败问题
  17. LVDS、FPD-Link/GMSL、MIPI的区别
  18. 动手学EDA-建模调参
  19. 浅析设备管理的MTTR,MTTF,MTBF计算方法
  20. Linkcloud:IP独立计费将云主机的灵活性推向极致

热门文章

  1. 决定一台计算机运行速度快慢的配件是什么,电脑运行慢换什么配件
  2. JVM-GC日志分析
  3. 基于eclipse的android项目实战—博学谷(二十二)登录图片验证码
  4. python爬数据是什么意思-python爬虫爬取的数据可以做什么
  5. 熊出没机器人光头强_《熊出没》五大兵器,天才威与光头强的战斗机器人谁更厉害?...
  6. 再次风靡春节的《熊出没》,究竟下了哪些硬功夫?
  7. littleVGL开发(10):事件(EVENT)
  8. linux 文件隐藏,Linux系统怎么隐藏文件夹和文件?
  9. 2、【易混淆概念集】-前三章 2 净现值 NPV 内部报酬率 IRR 投资回报率 ROI
  10. css打印如何去掉空白页,vue打印会多出一页空白页的坑