⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qrspec.c

📁 二维码QR的linux平台下的编码源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * qrencode - QR Code encoder * * QR Code specification in convenient format.  * Copyright (C) 2006,2007 Kentaro Fukuchi <fukuchi@megaui.net> * * The following data / specifications are taken from * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) *  or * "Automatic identification and data capture techniques --  *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "qrspec.h"/****************************************************************************** * Version and capacity *****************************************************************************/typedef struct {	int width; //< Edge length of the symbol	int words;  //< Data capacity (bytes)	int remainder; //< Remainder bit (bits)	int ec[4];  //< Number of ECC code (bytes)} QRspec_Capacity;/** * Table of the capacity of symbols * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004. */static const QRspec_Capacity qrspecCapacity[QRSPEC_VERSION_MAX + 1] = {	{  0,    0, 0, {   0,    0,    0,    0}},	{ 21,   26, 0, {   7,   10,   13,   17}}, // 1	{ 25,   44, 7, {  10,   16,   22,   28}},	{ 29,   70, 7, {  15,   26,   36,   44}},	{ 33,  100, 7, {  20,   36,   52,   64}},	{ 37,  134, 7, {  26,   48,   72,   88}}, // 5	{ 41,  172, 7, {  36,   64,   96,  112}},	{ 45,  196, 0, {  40,   72,  108,  130}},	{ 49,  242, 0, {  48,   88,  132,  156}},	{ 53,  292, 0, {  60,  110,  160,  192}},	{ 57,  346, 0, {  72,  130,  192,  224}}, //10	{ 61,  404, 0, {  80,  150,  224,  264}},	{ 65,  466, 0, {  96,  176,  260,  308}},	{ 69,  532, 0, { 104,  198,  288,  352}},	{ 73,  581, 3, { 120,  216,  320,  384}},	{ 77,  655, 3, { 132,  240,  360,  432}}, //15	{ 81,  733, 3, { 144,  280,  408,  480}},	{ 85,  815, 3, { 168,  308,  448,  532}},	{ 89,  901, 3, { 180,  338,  504,  588}},	{ 93,  991, 3, { 196,  364,  546,  650}},	{ 97, 1085, 3, { 224,  416,  600,  700}}, //20	{101, 1156, 4, { 224,  442,  644,  750}},	{105, 1258, 4, { 252,  476,  690,  816}},	{109, 1364, 4, { 270,  504,  750,  900}},	{113, 1474, 4, { 300,  560,  810,  960}},	{117, 1588, 4, { 312,  588,  870, 1050}}, //25	{121, 1706, 4, { 336,  644,  952, 1110}},	{125, 1828, 4, { 360,  700, 1020, 1200}},	{129, 1921, 3, { 390,  728, 1050, 1260}},	{133, 2051, 3, { 420,  784, 1140, 1350}},	{137, 2185, 3, { 450,  812, 1200, 1440}}, //30	{141, 2323, 3, { 480,  868, 1290, 1530}},	{145, 2465, 3, { 510,  924, 1350, 1620}},	{149, 2611, 3, { 540,  980, 1440, 1710}},	{153, 2761, 3, { 570, 1036, 1530, 1800}},	{157, 2876, 0, { 570, 1064, 1590, 1890}}, //35	{161, 3034, 0, { 600, 1120, 1680, 1980}},	{165, 3196, 0, { 630, 1204, 1770, 2100}},	{169, 3362, 0, { 660, 1260, 1860, 2220}},	{173, 3532, 0, { 720, 1316, 1950, 2310}},	{177, 3706, 0, { 750, 1372, 2040, 2430}} //40};int QRspec_getDataLength(int version, QRecLevel level){	return qrspecCapacity[version].words - qrspecCapacity[version].ec[level];}int QRspec_getECCLength(int version, QRecLevel level){	return qrspecCapacity[version].ec[level];}int QRspec_getMinimumVersion(int size, QRecLevel level){	int i;	int words;	for(i=1; i<= QRSPEC_VERSION_MAX; i++) {		words  = qrspecCapacity[i].words - qrspecCapacity[i].ec[level];		if(words >= size) return i;	}	return -1;}int QRspec_getWidth(int version){	return qrspecCapacity[version].width;}int QRspec_getRemainder(int version){	return qrspecCapacity[version].remainder;}/****************************************************************************** * Length indicator *****************************************************************************/static const int lengthTableBits[4][3] = {	{10, 12, 14},	{ 9, 11, 13},	{ 8, 16, 16},	{ 8, 10, 12}};int QRspec_lengthIndicator(QRencodeMode mode, int version){	int l;	if(version <= 9) {		l = 0;	} else if(version <= 26) {		l = 1;	} else {		l = 2;	}	return lengthTableBits[mode][l];}int QRspec_maximumWords(QRencodeMode mode, int version){	int l;	int bits;	int words;	if(version <= 9) {		l = 0;	} else if(version <= 26) {		l = 1;	} else {		l = 2;	}	bits = lengthTableBits[mode][l];	words = (1 << bits) - 1;	if(mode == QR_MODE_KANJI) {		words *= 2; // the number of bytes is required	}	return words;}/****************************************************************************** * Error correction code *****************************************************************************//** * Table of the error correction code (Reed-Solomon block) * See Table 12-16 (pp.30-36), JIS X0510:2004. */static const int eccTable[QRSPEC_VERSION_MAX+1][4][2] = {	{{ 0,  0}, { 0,  0}, { 0,  0}, { 0,  0}},	{{ 1,  0}, { 1,  0}, { 1,  0}, { 1,  0}}, // 1	{{ 1,  0}, { 1,  0}, { 1,  0}, { 1,  0}},	{{ 1,  0}, { 1,  0}, { 2,  0}, { 2,  0}},	{{ 1,  0}, { 2,  0}, { 2,  0}, { 4,  0}},	{{ 1,  0}, { 2,  0}, { 2,  2}, { 2,  2}}, // 5	{{ 2,  0}, { 4,  0}, { 4,  0}, { 4,  0}},	{{ 2,  0}, { 4,  0}, { 2,  4}, { 4,  1}},	{{ 2,  0}, { 2,  2}, { 4,  2}, { 4,  2}},	{{ 2,  0}, { 3,  2}, { 4,  4}, { 4,  4}},	{{ 2,  2}, { 4,  1}, { 6,  2}, { 6,  2}}, //10	{{ 4,  0}, { 1,  4}, { 4,  4}, { 3,  8}},	{{ 2,  2}, { 6,  2}, { 4,  6}, { 7,  4}},	{{ 4,  0}, { 8,  1}, { 8,  4}, {12,  4}},	{{ 3,  1}, { 4,  5}, {11,  5}, {11,  5}},	{{ 5,  1}, { 5,  5}, { 5,  7}, {11,  7}}, //15	{{ 5,  1}, { 7,  3}, {15,  2}, { 3, 13}},	{{ 1,  5}, {10,  1}, { 1, 15}, { 2, 17}},	{{ 5,  1}, { 9,  4}, {17,  1}, { 2, 19}},	{{ 3,  4}, { 3, 11}, {17,  4}, { 9, 16}},	{{ 3,  5}, { 3, 13}, {15,  5}, {15, 10}}, //20	{{ 4,  4}, {17,  0}, {17,  6}, {19,  6}},	{{ 2,  7}, {17,  0}, { 7, 16}, {34,  0}},	{{ 4,  5}, { 4, 14}, {11, 14}, {16, 14}},	{{ 6,  4}, { 6, 14}, {11, 16}, {30,  2}},	{{ 8,  4}, { 8, 13}, { 7, 22}, {22, 13}}, //25	{{10,  2}, {19,  4}, {28,  6}, {33,  4}},	{{ 8,  4}, {22,  3}, { 8, 26}, {12, 28}},	{{ 3, 10}, { 3, 23}, { 4, 31}, {11, 31}},	{{ 7,  7}, {21,  7}, { 1, 37}, {19, 26}},	{{ 5, 10}, {19, 10}, {15, 25}, {23, 25}}, //30	{{13,  3}, { 2, 29}, {42,  1}, {23, 28}},	{{17,  0}, {10, 23}, {10, 35}, {19, 35}},	{{17,  1}, {14, 21}, {29, 19}, {11, 46}},	{{13,  6}, {14, 23}, {44,  7}, {59,  1}},	{{12,  7}, {12, 26}, {39, 14}, {22, 41}}, //35	{{ 6, 14}, { 6, 34}, {46, 10}, { 2, 64}},	{{17,  4}, {29, 14}, {49, 10}, {24, 46}},	{{ 4, 18}, {13, 32}, {48, 14}, {42, 32}},	{{20,  4}, {40,  7}, {43, 22}, {10, 67}},	{{19,  6}, {18, 31}, {34, 34}, {20, 61}},//40};int *QRspec_getEccSpec(int version, QRecLevel level){	int b1, b2;	int data, ecc;	int *array;	b1 = eccTable[version][level][0];	b2 = eccTable[version][level][1];	data = QRspec_getDataLength(version, level);	ecc  = QRspec_getECCLength(version, level);	array = (int *)malloc(sizeof(int) * 6);	if(b2 == 0) {		array[0] = b1;		array[1] = data / b1;		array[2] = ecc / b1;		array[3] = array[4] = array[5] = 0;	} else {		array[0] = b1;		array[1] = data / (b1 + b2);		array[2] = ecc  / (b1 + b2);		array[3] = b2;		array[4] = array[1] + 1;		array[5] = (ecc - (array[2] * b1)) / b2;	}	return array;}/****************************************************************************** * Alignment pattern *****************************************************************************//** * Positions of alignment patterns. * This array includes only the second and the third position of the alignment * patterns. Rest of them can be calculated from the distance between them. * * See Table 1 in Appendix E (pp.71) of JIS X0510:2004. */static const int alignmentPattern[QRSPEC_VERSION_MAX+1][2] = {	{ 0,  0},	{ 0,  0}, {18,  0}, {22,  0}, {26,  0}, {30,  0}, // 1- 5	{34,  0}, {22, 38}, {24, 42}, {26, 46}, {28, 50}, // 6-10	{30, 54}, {32, 58}, {34, 62}, {26, 46}, {26, 48}, //11-15	{26, 50}, {30, 54}, {30, 56}, {30, 58}, {34, 62}, //16-20	{28, 50}, {26, 50}, {30, 54}, {28, 54}, {32, 58}, //21-25	{30, 58}, {34, 62}, {26, 50}, {30, 54}, {26, 52}, //26-30	{30, 56}, {34, 60}, {30, 58}, {34, 62}, {30, 54}, //31-35	{24, 50}, {28, 54}, {32, 58}, {26, 54}, {30, 58}, //35-40};QRspec_Alignment *QRspec_getAlignmentPattern(int version){	int width;	int d, w, x, y, cx, cy;	QRspec_Alignment *al;	int *p;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -