algorytm.org

Implementacja w Java

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

UPC-E - Implementacja w Java
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 29 sierpnia 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

BarCode.java:
/**
 * @author Tomasz Lubinski
 * (c)2007 algorytm.org
 *
 *  UPCE Bar Code
 */
public class BarCode {
	
	private static final byte parityTable[][][] = {
        {
            {1, 1, 1, 0, 0, 0},
            {1, 1, 0, 1, 0, 0},
            {1, 1, 0, 0, 1, 0},
            {1, 1, 0, 0, 0, 1},
            {1, 0, 1, 1, 0, 0},
            {1, 0, 0, 1, 1, 0},
            {1, 0, 0, 0, 1, 1},
            {1, 0, 1, 0, 1, 0},
            {1, 0, 1, 0, 0, 1},
            {1, 0, 0, 1, 0, 1}
        },
        {
            {0, 0, 0, 1, 1, 1},
            {0, 0, 1, 0, 1, 1},
            {0, 0, 1, 1, 0, 1},
            {0, 0, 1, 1, 1, 0},
            {0, 1, 0, 0, 1, 1},
            {0, 1, 1, 0, 0, 1},
            {0, 1, 1, 1, 0, 0},
            {0, 1, 0, 1, 0, 1},
            {0, 1, 0, 1, 1, 0},
            {0, 1, 1, 0, 1, 0}
        }
	};

	private static final byte left[][][] = {
        {
            {0, 0, 0, 1, 1, 0, 1},
            {0, 0, 1, 1, 0, 0, 1},
            {0, 0, 1, 0, 0, 1, 1},
            {0, 1, 1, 1, 1, 0, 1},
            {0, 1, 0, 0, 0, 1, 1},
            {0, 1, 1, 0, 0, 0, 1},
            {0, 1, 0, 1, 1, 1, 1},
            {0, 1, 1, 1, 0, 1, 1},
            {0, 1, 1, 0, 1, 1, 1},
            {0, 0, 0, 1, 0, 1, 1}
        },
        {
            {0, 1, 0, 0, 1, 1, 1},
            {0, 1, 1, 0, 0, 1, 1},
            {0, 0, 1, 1, 0, 1, 1},
            {0, 1, 0, 0, 0, 0, 1},
            {0, 0, 1, 1, 1, 0, 1},
            {0, 1, 1, 1, 0, 0 ,1},
            {0, 0, 0, 0, 1, 0, 1},
            {0, 0, 1, 0, 0, 0 ,1},
            {0, 0, 0, 1, 0, 0, 1},
            {0, 0, 1, 0, 1, 1, 1}
        }
	};
	
	public byte[] convert(byte UPCE[]) {
		
		/* inccorect length or check sum, return null */
		if ((UPCE == null) ||
			(UPCE.length != 8) || 
			(checkSum(UPCE) == false)) {
			return null;
		}
		
		byte bars[] = new byte[51];
        for (int i=0; i<51; i++) {
            bars[i] = 0;
        }
        
        bars[0] = 1;
        bars[1] = 0;
        bars[2] = 1;

        for (int i=1; i<7; i++) {
                for (int j=0; j<7; j++) {
                        bars[(i-1)*7 + 3 + j] = left[parityTable[UPCE[0]][UPCE[7]][i-1]][UPCE[i]][j];
                }
        }
		
		bars[45] = 0;
        bars[46] = 1;
        bars[47] = 0;
        bars[48] = 1;
        bars[49] = 0;
        bars[50] = 1;

		return bars;
	}
	
	/**
	 * calculates checksum of UPCE
	 */
	private boolean checkSum(byte upce[]) {
		
		   byte upca[] = new byte[12];
		   
		   //check system number
		   if ((upce[0] != 0) && (upce[0] != 1))
		   {
		      return false;
	        
		   }

		   //convert UPC-E to UPC-A
		   if ((upce[6] >= 0) && (upce[6] <= 2))
		   {
			  upca[3] = upce[6];      
		      upca[4] = 0;
		      upca[5] = 0;
		      upca[6] = 0;
		      upca[7] = 0;
		      upca[8] = upce[3];
		      upca[9] = upce[4];
		      upca[10] = upce[5];
		   }
		   else if ((upce[6] == 3) && (upce[3] >= 3) && (upce[3] <= 9))
		   {
		      upca[3] = upce[3];      
		      upca[4] = 0;
		      upca[5] = 0;
		      upca[6] = 0;
		      upca[7] = 0;
		      upca[8] = 0;
		      upca[9] = upce[4];
		      upca[10] = upce[5];
		   }
		   else if (upce[6] == 4)
		   {
		      upca[3] = upce[3];      
		      upca[4] = upce[4];
		      upca[5] = 0;
		      upca[6] = 0;
		      upca[7] = 0;                  
		      upca[8] = 0;
		      upca[9] = 0;
		      upca[10] = upce[5];
		   }
		   else if ((upce[6] >= 5) && (upce[6] <= 9))
		   {
		      upca[3] = upce[3];      
		      upca[4] = upce[4];
		      upca[5] = upce[5];
		      upca[6] = 0;
		      upca[7] = 0;                  
		      upca[8] = 0;
		      upca[9] = 0;
		      upca[10] = upce[6];
		   }
		   else
		   {
			  return false;     
		   }
		   
		   //copy two first digits of producer code
		   upca[1] = upce[1];
		   upca[2] = upce[2];
		   
		   //copy system numer and chec digit
		   upca[0] = upce[0];
		   upca[11] = upce[7];   
		   
		   //control check digit
		   int sum = 3 * upca[0] +
           	1 * upca[1] +
           	3 * upca[2] +
           	1 * upca[3] +
           	3 * upca[4] +
           	1 * upca[5] +
           	3 * upca[6] +
           	1 * upca[7] +
           	3 * upca[8] +
           	1 * upca[9] +
           	3 * upca[10];
		   sum %= 10;
		   sum = 10 - sum;
		   sum %= 10;
		   if (sum != upca[11])
		   {
			   System.out.println(sum);
			   System.out.println(upca[11]);
			   return false;
		   }
		   
		return true;
	}
}
Komentarze
photo
0 # Romek 2018-12-07 23:52
Niestety indeksy w tablicach upca i upce nie zgadzają się z implementacja w Delphi
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz