2011. 7. 13. 13:46 알고리즘

참고 : http://www.codeproject.com/KB/graphics/BarcodeLibrary.aspx
참고: http://www.codeproject.com/KB/cpp/includeh10.aspx
위의 주소에 보면 비쥬얼 스튜디오로 돌려 볼수있게 잘되어있다
모든 바코드 소스를 확인해볼수있다

아래의 코드는 참고 사이트에서 코드를 참고한것이다
내가 사용할 128a만 뽑아서
원래는 wipic용으로 만들었다가 다시 플랫폼이 변경되서
wipijava용으로 변경한것이다



import org.kwis.msp.lcdui.Graphics;

public class BarcodeClass {

 int ga2_Code128[][] = {
   { 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
     80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
     95, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
     31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
     46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
     61, 62, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 95, 96, 97,
     98, 99, 100, 101, 102, 103, 104, 105, 106, },
   { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
     31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
     46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
     61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
     76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
     91, 92, 93, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 95, 96, 97,
     98, 99, 100, 101, 102, 103, 104, 105, 106, } };

 int ch[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
   18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
   35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
   52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
   69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
   86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101,
   102, 103, 104, 105, 106 };

 String psz[] = { "bbsbbssbbss", "bbssbbsbbss", "bbssbbssbbs",
   "bssbssbbsss", "bssbsssbbss", "bsssbssbbss", "bssbbssbsss",
   "bssbbsssbss", "bsssbbssbss", "bbssbssbsss", "bbssbsssbss",
   "bbsssbssbss", "bsbbssbbbss", "bssbbsbbbss", "bssbbssbbbs",
   "bsbbbssbbss", "bssbbbsbbss", "bssbbbssbbs", "bbssbbbssbs",
   "bbssbsbbbss", "bbssbssbbbs", "bbsbbbssbss", "bbssbbbsbss",
   "bbbsbbsbbbs", "bbbsbssbbss", "bbbssbsbbss", "bbbssbssbbs",
   "bbbsbbssbss", "bbbssbbsbss", "bbbssbbssbs", "bbsbbsbbsss",
   "bbsbbsssbbs", "bbsssbbsbbs", "bsbsssbbsss", "bsssbsbbsss",
   "bsssbsssbbs", "bsbbsssbsss", "bsssbbsbsss", "bsssbbsssbs",
   "bbsbsssbsss", "bbsssbsbsss", "bbsssbsssbs", "bsbbsbbbsss",
   "bsbbsssbbbs", "bsssbbsbbbs", "bsbbbsbbsss", "bsbbbsssbbs",
   "bsssbbbsbbs", "bbbsbbbsbbs", "bbsbsssbbbs", "bbsssbsbbbs",
   "bbsbbbsbsss", "bbsbbbsssbs", "bbsbbbsbbbs", "bbbsbsbbsss",
   "bbbsbsssbbs", "bbbsssbsbbs", "bbbsbbsbsss", "bbbsbbsssbs",
   "bbbsssbbsbs", "bbbsbbbbsbs", "bbssbssssbs", "bbbbsssbsbs",
   "bsbssbbssss", "bsbssssbbss", "bssbsbbssss", "bssbssssbbs",
   "bssssbsbbss", "bssssbssbbs", "bsbbssbssss", "bsbbssssbss",
   "bssbbsbssss", "bssbbssssbs", "bssssbbsbss", "bssssbbssbs",
   "bbssssbssbs", "bbssbsbssss", "bbbbsbbbsbs", "bbssssbsbss",
   "bsssbbbbsbs", "bsbssbbbbss", "bssbsbbbbss", "bssbssbbbbs",
   "bsbbbbssbss", "bssbbbbsbss", "bssbbbbssbs", "bbbbsbssbss",
   "bbbbssbsbss", "bbbbssbssbs", "bbsbbsbbbbs", "bbsbbbbsbbs",
   "bbbbsbbsbbs", "bsbsbbbbsss", "bsbsssbbbbs", "bsssbsbbbbs",
   "bsbbbbsbsss", "bsbbbbsssbs", "bbbbsbsbsss", "bbbbsbsssbs",
   "bsbbbsbbbbs", "bsbbbbsbbbs", "bbbsbsbbbbs", "bbbbsbsbbbs",
   "bbsbssssbss", "bbsbssbssss", "bbsbssbbbss", "bbsssbbbsbsbb" };

 final int SETA = 0;
 final int SETB = 1;
 final int SETC = 2;

 byte ia_Buf[] = new byte[4096];
 int i_LenBuf;

 int i_Ratio;

 void BarcodeBase() {
  Clear();
  i_Ratio = 3;
 }

 void Clear() {

  int i;
  for (i = 0; i < 4096; i++)
   ia_Buf[i] = 0;
  i_LenBuf = 0;
 }

 int GetEncodeLength() {

  int i, iLen = 0;
  for (i = 0; i < i_LenBuf; i++) {
   if ((ia_Buf[i] & 2) != 0)
    iLen += (i_Ratio - 1);
  }
  return iLen + i_LenBuf;
 }

 int GetBufferLength() {
  return i_LenBuf;
 }

 int GetRatio() {
  return i_Ratio;
 }

 int SetRatio(int iRatio) {
  i_Ratio = iRatio;
  if (i_Ratio <= 0)
   i_Ratio = 1;
  return 0;
 }

 void DrawBarCodeLine(Graphics hDC, int sx, int sy, int ex, int ey,
   int Color, int penW) {
  // 이건 내가 그리는 구현하자
  // SetColorHEX(Color);
  // FillRect(g_ScreenFB,sx,sy,penW,ey);
  hDC.setColor(Color);
  hDC.drawLine(sx, sy, ex, ey);

  System.out.println("sx "+sx+" sy "+sy+" penW "+penW+" ey "+ey+" COLOR "+Color);
  // DEBUGMSG("sx %d sy %d ex %d ey %d COLOR %d\n",sx, sy, ex, ey,Color);

 }

 void DrawBarcode(Graphics hDC, int iX, int iY0, int iY10, int iY11,
   int iPenW) {
  int clrBar = 0x0;
  int clrSpace = 0xffffff;
  
  // byte *pb=ia_Buf;
  int i0, iNum0 = i_LenBuf;

  byte bBar;
  int i1, iNum1;
  int iY;
  System.out.println("i_LenBuf "+i_LenBuf);
  for (i0 = 0; i0 < iNum0; i0++) {
   bBar = (byte) (ia_Buf[i0] & 0x01);
   iNum1 = (ia_Buf[i0] & 0x02) != 0 ? i_Ratio : 1;
   iY = (ia_Buf[i0] & 0x04) != 0 ? iY11 : iY10;
   for (i1 = 0; i1 < iNum1; i1++) {
    
    if (bBar != 0) {
     DrawBarCodeLine(hDC, iX, iY0, iX, iY, clrBar, iPenW);
    } else {
     DrawBarCodeLine(hDC, iX, iY0, iX, iY, clrSpace, iPenW);
    }
    iX += iPenW;
   }

  }
 }

 boolean Encode128A(String pszCode) {
  Clear();
  char pszCodereturn[] = pszCode.toCharArray();
  // 혹시 널 붙지 않을까 걱정이네
  return P_Encode128(pszCodereturn, SETA);
 }

 void Draw128(Graphics hDC, int iX, int iY0, int iY1, int iPenW) {
  DrawBarcode(hDC, iX, iY0, iY1, iY1, iPenW);
 }

 boolean P_Encode128(char pszCode[], int iSetIn) {
  // Clear();
  // byte pFst[] = ia_Buf;
  // byte pb[] = ia_Buf;

  int iCheckDigit = GetCheckDigit(iSetIn, pszCode);

  int iNum = pszCode.length;

  int iChar, iCharNext;
  int iPosition = 0;
  int iSet = iSetIn;
  count = 0;

  if (iSetIn == SETA)
   ia_Buf = P_GetBarSpace128(ia_Buf, 103);
  else if (iSetIn == SETB)
   ia_Buf = P_GetBarSpace128(ia_Buf, 104);
  else
   ia_Buf = P_GetBarSpace128(ia_Buf, 105);

  if (ia_Buf == null)
   return false;

  while (iPosition < iNum) {
   {
    int iTemp2 = pszCode[iPosition];
    if (iTemp2 < -1)
     iTemp2 = iTemp2 & 255;

    iChar = ga2_Code128[iSet][iTemp2];

    ia_Buf = P_GetBarSpace128(ia_Buf, iChar);
    if (ia_Buf == null)
     return false;
    iPosition++;
    if (iSet == SETA) {
     if (iChar == 100)
      iSet = SETB;
     else if (iChar == 99)
      iSet = SETC;
    } else if (iSet == SETB) {
     if (iChar == 101)
      iSet = SETA;
     else if (iChar == 99)
      iSet = SETC;
    } else if (iChar == 98) {
     if (iSet == SETA)
      iCharNext = ga2_Code128[SETB][pszCode[iPosition]];
     else
      iCharNext = ga2_Code128[SETA][pszCode[iPosition]];

     ia_Buf = P_GetBarSpace128(ia_Buf, iChar);
     if (ia_Buf == null)
      return false;
     iPosition++;
    }
   }
  }

  ia_Buf = P_GetBarSpace128(ia_Buf, iCheckDigit);
  if (ia_Buf == null)
   return false;
  ia_Buf = P_GetBarSpace128(ia_Buf, 106);
  i_LenBuf = count;

  return true;
 }

 int count;

 byte[] P_GetBarSpace128(byte pb[], int iV) {
  int i;

  if (iV < 0)
   return null;
  if (iV > 106)
   return null;

  char buf[] = psz[iV].toCharArray();

  
  for (i = 0; i < 11; i++) {

   if (buf[i] == 'b')
    pb[count] += 1;
   count++;
  }
  if (iV == 106) {
   pb[count] += 1;
   count++;
   pb[count] += 1;
   count++;
  }
  return pb;
 }

 int GetCheckDigit(int iSet, char pszCode[]) {
  int iSum = 0, iCurSet = 0, iChar128, iCharNext, iWeight, iPosition;
  int iNum;

  iCurSet = iSet;
  if (iSet == SETA) {
   iSum = 103;
  } else if (iSet == SETB) {
   iSum = 104;
  } else if (iSet == SETC) {
   iSum = 105;
  }

  iPosition = 0;
  iWeight = 1;

  iNum = pszCode.length;
  while (iPosition < iNum) {

   {
    int iTemp2 = pszCode[iPosition];
    if (iTemp2 < -1)
     iTemp2 = iTemp2 & 255;

    iChar128 = ga2_Code128[iCurSet][iTemp2];

    iSum += (iWeight * iChar128);

    iPosition++;
    iWeight++;

    if (iCurSet == SETA) {
     if (iChar128 == 100)
      iCurSet = SETB;
     else if (iChar128 == 99)
      iCurSet = SETC;
    } else if (iCurSet == SETB) {
     if (iChar128 == 101)
      iCurSet = SETA;
     else if (iChar128 == 99)
      iCurSet = SETC;
    } else if (iChar128 == 98) {
     if (iCurSet == SETA)
      iCharNext = ga2_Code128[SETB][pszCode[iPosition]];
     else
      iCharNext = ga2_Code128[SETA][pszCode[iPosition]];

     iSum += (iWeight * iCharNext);
     iPosition++;
     iWeight++;
    }
   }
  }
  return iSum % 103;
 }
}

'알고리즘' 카테고리의 다른 글

gson 읽고 쓰기 java  (0) 2013.03.08
java des algorithm (자바 DES 알고리즘)  (0) 2011.07.25
swap  (0) 2011.04.27
도스명령어 년 월 일  (0) 2010.03.24
완성형 조합형을 이용한 한글 조합  (0) 2010.01.26
posted by 욱이다