using System;
using System.Text;
public static class Ean13BarcodeHelper
{
public static string EncodeData(string inData)
{
if (inData.Length != 12)
throw new ApplicationException("Barkod data uzunluğu hatalı");
for (int i = 0; i < inData.Length; i++)
{
if (!char.IsDigit(inData[i]))
throw new ApplicationException("Barkod data numerik değil");
}
char[] outData = new char[12];
for (int i = 0; i < 12; i++)
{
outData[i] = inData[i];
}
outData[0] = (char)(((byte)inData[0]) - 13);
for (int i = 7; i < inData.Length; i++)
{
outData[i] = (char)(((byte)inData[i]) + 49);
}
char[] B3_B7 = GetB3_B7(inData);
char BCSUM = (char)(((byte)CheckSum(inData)) + 49);
StringBuilder sb = new StringBuilder();
sb.Append(outData[0]);
sb.Append("!");
sb.Append(outData[1]);
sb.Append(B3_B7);
sb.Append("-");
for (int i = 7; i < 12; i++)
{
sb.Append(outData[i]);
}
sb.Append(BCSUM);
sb.Append("!");
return sb.ToString();
}
public static string DecodeData(string inData)
{
StringBuilder sb = new StringBuilder();
sb.Append((char)(((byte)inData[0]) + 13));
sb.Append(inData[2]);
sb.Append(UndoGetB3_B7(inData));
for (int i = 9; i < 14; i++)
{
sb.Append((char)(((byte)inData[i]) - 49));
}
return sb.ToString();
}
private static char CheckSum(string inData)
{
int CSUM1 = 0;
int CSUM_TEK = 0, CSUM_CIFT = 0, CSUM_TOP = 0;
for (int jj = 0; jj < 6; jj++)
{
CSUM_TEK = Convert.ToInt32(inData.Substring(jj * 2, 1));
CSUM_CIFT = Convert.ToInt32(inData.Substring(jj * 2 + 1, 1));
CSUM_TOP += CSUM_TEK + (CSUM_CIFT * 3);
}
CSUM1 = ((10 - (CSUM_TOP % 10)) % 10);
return CSUM1.ToString()[0];
}
private static char[] UndoGetB3_B7(string inData)
{
char[] B3_B7 = null;
char B0 = ((char)(((byte)inData[0]) + 13));
char B2 = inData[3];
char B3 = inData[4];
char B4 = inData[5];
char B5 = inData[6];
char B6 = inData[7];
switch (B0)
{
case '0':
B3_B7 = new char[5] { B2, B3, B4, B5, B6 };
break;
case '1':
B3_B7 = new char[5] { B2, UndoBC3(B3),
B4, UndoBC3(B5), UndoBC3(B6) };
break;
case '2':
B3_B7 = new char[5] { B2, UndoBC3(B3),
UndoBC3(B4), B5, UndoBC3(B6) };
break;
case '3':
B3_B7 = new char[5] { B2, UndoBC3(B3),
UndoBC3(B4), UndoBC3(B5), B6 };
break;
case '4':
B3_B7 = new char[5] { UndoBC3(B2), B3,
B4, UndoBC3(B5), UndoBC3(B6) };
break;
case '5':
B3_B7 = new char[5] { UndoBC3(B2),
UndoBC3(B3), B4, B5, UndoBC3(B6) };
break;
case '6':
B3_B7 = new char[5] { UndoBC3(B2), UndoBC3(B3),
UndoBC3(B4), B5, B6 };
break;
case '7':
B3_B7 = new char[5] { UndoBC3(B2), B3,
UndoBC3(B4), B5, UndoBC3(B6) };
break;
case '8':
B3_B7 = new char[5] { UndoBC3(B2), B3,
UndoBC3(B4), UndoBC3(B5), B6 };
break;
case '9':
B3_B7 = new char[5] { UndoBC3(B2), UndoBC3(B3),
B4, UndoBC3(B5), B6 };
break;
}
return B3_B7;
}
private static char[] GetB3_B7(string inData)
{
char[] B3_B7 = null;
char B0 = inData[0];
char B2 = inData[2];
char B3 = inData[3];
char B4 = inData[4];
char B5 = inData[5];
char B6 = inData[6];
switch (B0)
{
case '0':
B3_B7 = new char[5] { B2, B3, B4, B5, B6 };
break;
case '1':
B3_B7 = new char[5] { B2, BC3(B3), B4,
BC3(B5), BC3(B6) };
break;
case '2':
B3_B7 = new char[5] { B2, BC3(B3), BC3(B4),
B5, BC3(B6) };
break;
case '3':
B3_B7 = new char[5] { B2, BC3(B3), BC3(B4),
BC3(B5), B6 };
break;
case '4':
B3_B7 = new char[5] { BC3(B2), B3, B4,
BC3(B5), BC3(B6) };
break;
case '5':
B3_B7 = new char[5] { BC3(B2), BC3(B3),
B4, B5, BC3(B6) };
break;
case '6':
B3_B7 = new char[5] { BC3(B2), BC3(B3),
BC3(B4), B5, B6 };
break;
case '7':
B3_B7 = new char[5] { BC3(B2), B3, BC3(B4),
B5, BC3(B6) };
break;
case '8':
B3_B7 = new char[5] { BC3(B2), B3, BC3(B4),
BC3(B5), B6 };
break;
case '9':
B3_B7 = new char[5] { BC3(B2), BC3(B3), B4,
BC3(B5), B6 };
break;
}
return B3_B7;
}
private static char UndoBC3(char B)
{
return (char)(((byte)B) - 17);
}
private static char BC3(char B)
{
return (char)(((byte)B) + 17);
}
}