Saltar al contenido

Algo anda mal con mi código de barras (Código 128)

El paso a paso o código que hallarás en este post es la solución más eficiente y válida que encontramos a esta duda o problema.

Solución:

¿Está creando el carácter de suma de comprobación correcto?

Eche un vistazo a esta página para ver cómo calcular la suma de comprobación

Para obtener una alternativa, eche un vistazo al siguiente enlace, que le permite crear mapas de bits de códigos de barras:

http://www.codeproject.com/KB/graphics/BarcodeLibrary.aspx?fid=470627&fr=26#xx0xx

El código 128 se puede representar con una fuente totalmente fina. Sin embargo, es más complicado que 3 de 9 porque debe incluir un carácter de suma de verificación al final que debe calcularse dinámicamente en función del contenido del código de barras. También hay 3 versiones diferentes, cada una de las cuales tiene un carácter de inicio diferente.

En otras palabras, el código de barras debe presentarse como:

[start char][barcode][checksum][stop char]

El beneficio de code128 es que es mucho más conciso que 3 de 9.

Esta página me ayudó a desarrollar el algoritmo para calcular mis sumas de comprobación.

Una descripción general muy general del algoritmo es:

  1. A cada carácter del código de barras se le asigna un valor específico dependiendo de qué carácter es y dónde se encuentra en el código de barras.

  2. Todos los valores de 1) anteriores se suman.

  3. Obtenga el valor del módulo 103 del total en 2) arriba.

  4. En la mayoría de los casos, el carácter de suma de comprobación será el código ASCII para: (valor del módulo más 32) como se determina en 3) arriba.

Hubo algunos matices, terminé necesitando crear este algoritmo en javascript de todas las cosas (sin preguntas). Para mi propia referencia futura y para mostrar algunos de los matices, así es como se veía:

/*
 * This is the variable part of my barcode, I append this to a 
 * static prefix later, but I need to perform logic to compute the 
 * checksum for this variable. There is logic earlier that enforces 
 * this variable as a 9 character string containing only digits.   
 */ 
var formIncrement = // a 9 char "digit" string variable

/*
 * Dynamically compute the total checksum value (before modulus) 
 * for the variable part of my barcode, I will need to get a modulus 
 * from this total when I am done. If you need a variable number of 
 * characters in your barcodes or if they are not all digits 
 * obviously something different would have to be done here.  
 */ 
var incrementCS = ((parseInt(formIncrement.charAt(0)) + 16) * 7) +
                  ((parseInt(formIncrement.charAt(1)) + 16) * 8) +
                  ((parseInt(formIncrement.charAt(2)) + 16) * 9) +
                  ((parseInt(formIncrement.charAt(3)) + 16) * 10) +
                  ((parseInt(formIncrement.charAt(4)) + 16) * 11) +
                  ((parseInt(formIncrement.charAt(5)) + 16) * 12) +
                  ((parseInt(formIncrement.charAt(6)) + 16) * 13) +
                  ((parseInt(formIncrement.charAt(7)) + 16) * 14) + 
                  ((parseInt(formIncrement.charAt(8)) + 16) * 15);

/*
 * 452 is the total checksum for my barcodes static prefix (600001), 
 * so it doesn't need to be computed dynamically, I just add it to 
 * the variable checksum total determined above and then get the 
 * modulus of that sum:  
 */ 
var checksum = (452 + incrementCS) % 103


var barcode = "š600001" + formIncrement

/*
 * The 0 and the 95 - 102 cases had to be defined explicitly because 
 * their checksum figures do not line up with the javascript char 
 * codes for some reason (see the code 128 definition table in the 
 * linked page) otherwise we simply need to get the charCode of the 
 * checksum + 32. I also tack on the stop char here. 
 */ 
switch (checksum) 
    case 0 :
    barcode += "€œ";
    break;
    case 95 :
    barcode += "‘œ";
    break;
    case 96 :
    barcode += "’œ";
    break;
    case 97 :
    barcode += "“œ";
    break;
    case 98 :
    barcode += "”œ";
    break;
    case 99 :
    barcode += "•œ";
    break;
    case 100 :
    barcode += "–œ";
    break;
    case 101 :
    barcode += "—œ";
    break;
    case 102 :
    barcode += "˜œ";
    break;
    default :
    barcode += String.fromCharCode(checksum + 32) + "œ";


return barcode;

Puede notar que mis caracteres de inicio y fin en mi ejemplo (š, œ) no parecen coincidir con los que se muestran en la página vinculada. Si recuerdo, creo que fue porque tenía una fuente de código 128 no estándar y estos caracteres se tradujeron a los correctos.

EDITAR

Revisé mi documentación. Parece que obtuve la fuente de aquí. Con esa fuente específicamente y usando el algoritmo anterior, acabo de hacer un código de barras code128b para test que salió a štestwœ, escaneó bien. Su algoritmo de suma de comprobación parece funcionar bien porque ambos tenemos w pero parece que los códigos de inicio y finalización están desactivados si obtiene: ÌtestwÎ.

Me propuse buscar la misma fuente de código de barras que estoy usando porque tengo la sensación de que diferentes marcas de fuentes code128 pueden implementar diferentes caracteres para representar los códigos de barras de inicio y parada.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *