The standard 2 of 5 barcode format encodes all of the information in the bars, and only uses the spaces for spacing purposes, unlike all the other barcodes we have looked at so far, and is used mostly in warehouses and airline ticketing.

Standard 2 of 5 Barcode

Standard 2 of 5 Barcode


To calculate the checksum digit, working through the digits from right to left, you add up the odd-positioned elements and even-positioned elements separately. We then find the checksum by 10 – ((((3 * odd) + even) modulo 10) modulo 10).

Using this full string then we apply the encoding, where a narrow bar is defined by 11 and a wide bar with 111111. The left guard is 1111011110110 and the right guard is 1111011011110.

The encodings for each digit is as follows

0 11011011111101111110110
1 11111101101101101111110
2 11011111101101101111110
3 11111101111110110110110
4 11011011111101101111110
5 11111101101111110110110
6 11011111101111110110110
7 11011011011111101111110
8 11111101101101111110110
9 11011111101101111110110


Here is the code to encode the barcode. The full source code is available here

namespace BarcoderLib
{
    public class BarcodeStandard2of5
    {
        private string gLeftGuard = "1111011110110";
        private string gRightGuard = "1111011011110";
        private string[] gCoding = { "11011011111101111110110", "11111101101101101111110", "11011111101101101111110",
                                     "11111101111110110110110", "11011011111101101111110", "11111101101111110110110",
                                     "11011111101111110110110", "11011011011111101111110", "11111101101101111110110", "11011111101101111110110" };
        public Bitmap Encode(string message)
        {
            string encodedMessage;
            string fullMessage;

            Bitmap barcodeImage = new Bitmap(400, 100);
            Graphics g = Graphics.FromImage(barcodeImage);

            Validate(message);

            fullMessage = message + CalcParity(message).ToString().Trim();
            encodedMessage = EncodeBarcode(fullMessage);

            PrintBarcode(g, encodedMessage, fullMessage, 350, 100);

            return barcodeImage;
        }
        private void Validate(string message)
        {

            Regex reNum = new Regex(@"^\d+$");
            if (reNum.Match(message).Success == false)
            {
                throw new Exception("Encode string must be numeric");
            }

        }

        private void PrintBarcode(Graphics g, string encodedMessage, string message, int width, int height)
        {
            SolidBrush whiteBrush = new SolidBrush(Color.White);
            SolidBrush blackBrush = new SolidBrush(Color.Black);
            Font textFont = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);
            g.FillRectangle(whiteBrush, 0, 0, width, height);

            int xPos = 20;
            int yTop = 10;
            int barHeight = 50;

            for (int i = 0; i < encodedMessage.Length; i++)
            {
                if (encodedMessage[i] == '1')
                {
                    g.FillRectangle(blackBrush, xPos, yTop, 1, barHeight);
                }
                xPos += 1;
            }

            xPos = 20;
            yTop += barHeight - 2;
            for (int i = 0; i < message.Length; i++)
            {
                g.DrawString(message[i].ToString().Trim(), textFont, blackBrush, xPos, yTop);
                xPos += 7;
            }
        }

        private string EncodeBarcode(string message)
        {
            int i;
            string encodedString = gLeftGuard;

            for (i = 0; i < message.Length; i++)
            {
                encodedString += gCoding[Convert.ToInt32(message[i].ToString())];
            }

            encodedString += gRightGuard;

            return encodedString;
        }

        private int CalcParity(string message)
        {
            int oddSum = 0;
            int evenSum = 0;
            int parity = 0;

            for (int i = message.Length - 1; i >= 0; i--)
            {
                if ((i % 2) == 0)
                {
                    evenSum += Convert.ToInt32(message[i].ToString());
                }else
                {
                    oddSum += Convert.ToInt32(message[i].ToString());
                }
            }

            parity = 10 - ((((3 * oddSum) + evenSum) % 10) % 10);
            if (parity == 10)
            {
                parity = 0;
            }
            return parity;
        }
    }
}
  • Share/Bookmark

Related posts:

  1. Barcodes in C#: MSI The MSI barcode, which also goes by the name of...
  2. Barcodes in C#: UPC-A The UPC-A barcode format is very similar to the EAN-13...
  3. Barcodes in C#: EAN-8 The EAN-8 barcode format is a compressed format of the...
  4. Barcodes in C#: UPC-2 UPC-2 is a simpler variation of the UPC-5 barcode designed...
  5. Barcodes in C#: Interleaved 2 of 5 The interleaved 2 of 5 barcode uses an scheme which...

Related posts brought to you by Yet Another Related Posts Plugin.