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; } }