You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.8 KiB
C#
98 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace BarcodeLib.Symbologies
|
|
{
|
|
/// <summary>
|
|
/// EAN-8 encoding
|
|
/// Written by: Brad Barnhill
|
|
/// </summary>
|
|
class EAN8 : BarcodeCommon, IBarcode
|
|
{
|
|
private string[] EAN_CodeA = { "0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011", "0110111", "0001011" };
|
|
private string[] EAN_CodeC = { "1110010", "1100110", "1101100", "1000010", "1011100", "1001110", "1010000", "1000100", "1001000", "1110100" };
|
|
|
|
public EAN8(string input)
|
|
{
|
|
Raw_Data = input;
|
|
|
|
CheckDigit();
|
|
}
|
|
/// <summary>
|
|
/// Encode the raw data using the EAN-8 algorithm.
|
|
/// </summary>
|
|
private string Encode_EAN8()
|
|
{
|
|
//check length
|
|
if (Raw_Data.Length != 8 && Raw_Data.Length != 7) Error("EEAN8-1: Invalid data length. (7 or 8 numbers only)");
|
|
|
|
//check numeric only
|
|
if (!CheckNumericOnly(Raw_Data)) Error("EEAN8-2: Numeric only.");
|
|
|
|
//encode the data
|
|
string result = "101";
|
|
|
|
//first half (Encoded using left hand / odd parity)
|
|
for (int i = 0; i < Raw_Data.Length / 2; i++)
|
|
{
|
|
result += EAN_CodeA[Int32.Parse(Raw_Data[i].ToString())];
|
|
}//for
|
|
|
|
//center guard bars
|
|
result += "01010";
|
|
|
|
//second half (Encoded using right hand / even parity)
|
|
for (int i = Raw_Data.Length / 2; i < Raw_Data.Length; i++)
|
|
{
|
|
result += EAN_CodeC[Int32.Parse(Raw_Data[i].ToString())];
|
|
}//for
|
|
|
|
result += "101";
|
|
|
|
return result;
|
|
}//Encode_EAN8
|
|
|
|
private void CheckDigit()
|
|
{
|
|
//calculate the checksum digit if necessary
|
|
if (Raw_Data.Length == 7)
|
|
{
|
|
//calculate the checksum digit
|
|
int even = 0;
|
|
int odd = 0;
|
|
|
|
//odd
|
|
for (int i = 0; i <= 6; i += 2)
|
|
{
|
|
odd += Int32.Parse(Raw_Data.Substring(i, 1)) * 3;
|
|
}//for
|
|
|
|
//even
|
|
for (int i = 1; i <= 5; i += 2)
|
|
{
|
|
even += Int32.Parse(Raw_Data.Substring(i, 1));
|
|
}//for
|
|
|
|
int total = even + odd;
|
|
int checksum = total % 10;
|
|
checksum = 10 - checksum;
|
|
if (checksum == 10)
|
|
checksum = 0;
|
|
|
|
//add the checksum to the end of the
|
|
Raw_Data += checksum.ToString();
|
|
}//if
|
|
}
|
|
|
|
#region IBarcode Members
|
|
|
|
public string Encoded_Value
|
|
{
|
|
get { return Encode_EAN8(); }
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|