Saltar al contenido
binarios.com.ar/blog/generar-codigos-de-barra-con-el-estandar-code128/

archivo / Programación

Generar códigos de barra con el estándar Code128

9 de marzo de 2012 3.191 palabras 10 imágenes 10 min de lectura 8.893 visitas

El empleo de códigos de barras está ampliamente difundido en todos los rincones del mundo, dada su sencillez de representar información, y ser accedida a ella de fomra rápida.

En este artículo abordamos la creación de estos códigos empleando el estándar code128 y un programa en C++

¿Qué es el Code128?

  • El Code 128 es una simbología de muy alta densidad. Es empleado para la representación de caracteres alfanuméricos o sólo numéricos.
  • Éste estandar puede codificar todos los 128 caracteres de la tabla ASCII, entre otros estándares (incluso caracteres latinos).
  • Es empleado ampliamente alrededor del mundo para el rastreo de paquetes, controles de stock industriales, identificación de contenedores y pallets en la cadena de abastecimiento.
  • La simbología fue definida como ISO/IEC 15417:2007.

Especificaciones

Un código de barra Code 128 posee seis (6) secciones:

  1. Zona de silencio (Quiet Zone)
  2. Caracter de inicio
  3. Datos codificados
  4. Caracter de verificación (Checksum)
  5. Caracter de finalización (2)
  6. Zona de silencio (1)

Secciones del Code128

Subtipos

Existen tres variantes para Code 128. Todos ellos en total incluyen 107 símbolos: 103 de datos, 3 caracteres de inicio y un único bit de parada.

Si bien todos comparten la simbología de barras, la forma de calcular cada uno de ellos es diferente.

  • 128A (Set de códigos A) - Caracteres ASCII 00 al 95 (0-9, A-Z y códigos de control), caracteres especiales y FNC 1-4
  • 128B (Set de códigos B) - Caracteres ASCII 32 al 127 (0-9, A-Z, a-z), caracteres especiales y FNC 1-4
  • 128C (Set de códigos C) - 00-99 (Codifica cada dos dígitos en un único código) y FNC1

Por razones de compatibilidad y utilidad, en este artículo emplearemos el 128B, ya que nos permite crear códigos alfanuméricos con mayúsculas y minúsculas.

Tabla ASCII

Antes de comenzar, es necesario saber la correspondencia que tiene el sistema Code128 con los valores ASCII de cada caracter. A continuación la tabla:

Valor128A128B128CCódigo ASCIICaracterBar/Space PatternBar/Space Weights
0spacespace000032 or 0212Space or Ô11011001100212222
1!!0133!11001101100222122
2""0234"11001100110222221
3##0335#10010011000121223
4$$0436$10010001100121322
5%%0537%10001001100131222
6&&0638&10011001000122213
7''0739'10011000100122312
8((0840(10001100100132212
9))0941)11001001000221213
10**1042*11001000100221312
11++1143+11000100100231212
12,,1244,10110011100112232
13--1345-10011011100122132
14..1446.10011001110122231
15//1547/10111001100113222
16001648010011101100123122
17111749110011100110123221
18221850211001110010223211
19331951311001011100221132
20442052411001001110221231
21552153511011100100213212
22662254611001110100223112
23772355711101101110312131
24882456811101001100311222
25992557911100101100321122
26::2658:11100100110321221
27;;2759;11101100100312212
28<<2860<11100110100322112
29==2961=11100110010322211
30>>3062>11011011000212123
31??3163?11011000110212321
32@@3264@11000110110232121
33AA3365A10100011000111323
34BB3466B10001011000131123
35CC3567C10001000110131321
36DD3668D10110001000112313
37EE3769E10001101000132113
38FF3870F10001100010132311
39GG3971G11010001000211313
40HH4072H11000101000231113
41II4173I11000100010231311
42JJ4274J10110111000112133
43KK4375K10110001110112331
44LL4476L10001101110132131
45MM4577M10111011000113123
46NN4678N10111000110113321
47OO4779O10001110110133121
48PP4880P11101110110313121
49QQ4981Q11010001110211331
50RR5082R11000101110231131
51SS5183S11011101000213113
52TT5284T11011100010213311
53UU5385U11011101110213131
54VV5486V11101011000311123
55WW5587W11101000110311321
56XX5688X11100010110331121
57YY5789Y11101101000312113
58ZZ5890Z11101100010312311
59[[5991[11100011010332111
60\\6092\11101111010314111
61]]6193]11001000010221411
62^^6294^11110001010431111
63__6395_10100110000111224
64NUL`6496`10100001100111422
65SOHa6597a10010110000121124
66STXb6698b10010000110121421
67ETXc6799c10000101100141122
68EOTd68100d10000100110141221
69ENQe69101e10110010000112214
70ACKf70102f10110000100112412
71BELg71103g10011010000122114
72BSh72104h10011000010122411
73HTi73105i10000110100142112
74LFj74106j10000110010142211
75VTk75107k11000010010241211
76FFl76108l11001010000221114
77CRm77109m11110111010413111
78SOn78110n11000010100241112
79SIo79111o10001111010134111
80DLEp80112p10100111100111242
81DC1q81113q10010111100121142
82DC2r82114r10010011110121241
83DC3s83115s10111100100114212
84DC4t84116t10011110100124112
85NAKu85117u10011110010124211
86SYNv86118v11110100100411212
87ETBw87119w11110010100421112
88CANx88120x11110010010421211
89EMy89121y11011011110212141
90SUBz90122z11011110110214121
91ESC{91123{11110110110412121
92FS|92124|10101111000111143
93GS}93125}10100011110111341
94RS~94126~10001011110131141
95USDEL95200È10111101000114113
96FNC 3FNC 396201É10111100010114311
97FNC 2FNC 297202Ê11110101000411113
98Shift BShift A98203Ë11110100010411311
99Code CCode C99204Ì10111011110113141
100Code BFNC4Code B205Í10111101110114131
101FNC 4Code ACode A206Î11101011110311141
102FNC 1FNC 1FNC 1207Ï11110101110411131
103Start Code A208Ð11010000100211412
104Start Code B209Ñ11010010000211214
105Start Code C210Ò11010011100211232
106Stop (7 bars/spaces)211Ó11000111010112331112
unused to prevent misreading211133

Bits de arranque y de finalización

Los bits de arranque y de finalización son los que delimitan todo el código comprendido entre ellos.

Valor128A128B128CASCIICaracterBar/Space PatternBar/Space Weights
103Start Code A208Ð11010000100211412
104Start Code B209Ñ11010010000211214
105Start Code C210Ò11010011100211232
106Stop (7 bars/spaces)211Ó11000111010112331112

Calcular el bit de verificación

Básicamente el armado es de la siguiente forma:

[INICIO]DATOS[BIT][FIN]

Empleando la variante B, el caracter de inicio y de fin es Ñ y Ó respectivamente, o ASCII 209 y ASCII 211.

El bit de comprobación será el encargado de comprobar que la lectura se haya realizado en forma correcta. Para calcularlo se emplea el método de suma ponderada. Su suma tiene la siguiente forma:

Donde:

  • Sp es la suma ponderada que necesitamos obtener en primer lugar.
  • 104 corresponde al bit de inicio (en el formato Code128)
  • n corresponde al total de caracteres que se desean convertir.
  • **ax **corresponde al caracter en particular que se está convirtiendo (en su código ASCII).

Una vez obtenido el valor de la suma (Sp) se divide por 103, obteniendo como dato útil el resto

Donde:

  • Bitc : Bit de comprobación
  • Sp es la suma ponderada obtenida anteriormente.
  • MOD operador matemático para obtener el resto de la división.

Finalmente para buscar el caracter ASCII equivalente al Code128 procede de la siguiente forma:

Es decir, si Bitc es menor que 95, entonces se suma 32 para lograr una correspondencia exacta con el caracter ASCII que le corresponde. Si es mayor o igual que 95, entonces se suma 50 para evitar caer el rango no deseado comprendido entre los valores 127 y 199.

El valor obtenido es el bit de comprobación (Bitc).


Ejemplo

Los casos quedan mucho más claros con un ejemplo. Para ello he desarrollado el siguiente prototipo:

Codificaremos la palabra Binari-OS en code128, variante B. Para ello ya se ha visto que la forma básica del armado es el siguiente:

[INICIO]Binari-OS**[Bit]**[FIN]

Los datos que ya se tienen son:

  • [INICIO] = Ñ ó ASCII 209
  • [FIN] = Ó ó ASCII 211
  • Binari-OS

Para hallar el único dato que queda, se debe comenzar obteniendo la correspondencia entre caracteres y su código ASCII:

A continuación se realiza la suma ponderada de todos los caracteres que tiene la cadena a codificar (Binari-OS) más el bit de inicio:

La suma de todos los caracteres correspondientes a Binari-OS = 2552. Luego éste valor se divide por 103 y obtenemos el resto.

2552 / 103 = 24 resto 80.

Finalmente, realizamos la última comprobación:  80 < 95, por lo que se debe sumar 32.

Es decir, el caracter de verificación corresponde al código ASCII 112, o más conocido como el caracter p.

Ahora estamos en condiciones de armar el código completo en ASCII:

ÑBinari-OSpÓ

Finalmente empleando una fuente como Code 128 quedará conformado el código:

Función en C++

Esta es una de las funciones más simples que se pueden encontrar en la red hechas para C++. La realicé para un proyecto particular.

/*		Desarrollado por Cristian1604 en C++ para Binarios
			         http://binari-os.com.ar
	        Documentación y ejemplos de aplicación en
http://binari-os.com.ar/index.php/cs-computacion/122-generar-codigos-de-barra-con-el-estandar-code128
			        	Marzo 2012
			         cristian1604@educ.ar
*/

int Code128 (char cadena[]) {
	int pos = 1;
	int i = 1;
	int checksum = 104;                             //el caracter de verificacion siempre es 104 para la norma B
	char _inicio = 'Ñ';
	char _final = 'Ó';
	char aux[50] = {'\0'};
	int char_a_int;
	char int_a_char;

	if (cadena[0] == '\0') 				//verifica que haya entrado algún parámetro. De lo contrario devuelve 1 (error)
		return 1;

	//copiar la cadena original a una auxiliar bit a bit
	do {
		aux[pos] = cadena[pos - 1];
		pos++;
	} while (cadena[pos - 1] != '\0');

	//En la cadena original insertamos el bit de inicio y reubicamos la cadena
	cadena[0] = _inicio;
	pos = 1;
	do {
		cadena[pos] = aux[pos];
		pos++;
	} while (aux[pos] != '\0');

	//ahora la variable 'pos' queda ubicada donde va el bit de paridad (checksum)

	do {
		char_a_int = cadena[i];
		checksum = checksum + ((char_a_int-32)*i);
		i++;
	} while (cadena[i] != '\0');

	checksum = (checksum % 103);        //103 vale para Code128.
	if (checksum < 95)
		checksum = checksum + 32;
	else
		checksum = checksum + 50;

	int_a_char = checksum;                    //pasar el valor numérico al tipo caracter

	cadena[pos] = int_a_char;
	pos++;
	cadena[pos] = _final;                        //agregar el bit de parada
	pos++;
	cadena[pos] = '\0';                           //fin de la cadena

	return 0;
}

Caja de Herramientas

He subido un generador de código de barras, el mismo que he desarrollado en C++, pero además posee una interfaz para mostrar el resultado. Click aquí para descargar

Tipogradía code128.ttf  Click aquí para descargar

binarios.com.ar · publicado el 09.03.2012
recuperado del archivo de Joomla en 2026
Texto e imágenes de Cristian Bottazzi bajo CC BY-NC-SA 4.0.
Código de barras Code128 que codifica binari-os