Nadesłany przez Tomasz Lubiński, 27 grudnia 2005 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)2005 algorytm.org * * EAN5 Bar Code */ public class BarCode { private static final byte parityTable[][] = { {0, 0, 0, 0, 0, 0}, {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 right[][] = { {1, 1, 1, 0, 0, 1, 0}, {1, 1, 0, 0, 1, 1, 0}, {1, 1, 0, 1, 1, 0, 0}, {1, 0, 0, 0, 0, 1, 0}, {1, 0, 1, 1, 1, 0, 0}, {1, 0, 0, 1, 1, 1, 0}, {1, 0, 1, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 0, 0, 0}, {1, 1, 1, 0, 1, 0, 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} } }; private static final byte checksumTable[][] = { {1, 1, 0, 0, 0}, {1, 0, 1, 0, 0}, {1, 0, 0, 1, 0}, {1, 0, 0, 0, 1}, {0, 1, 1, 0, 0}, {0, 0, 1, 1, 0}, {0, 0, 0, 1, 1}, {0, 1, 0, 1, 0}, {0, 1, 0, 0, 1}, {0, 0, 1, 0, 1} }; public byte[] convert(byte EAN5[]) { /* inccorect length or check sum, return null */ if ((EAN5 == null) || (EAN5.length != 5)) { return null; } byte bars[] = new byte[47]; for (int i=0; i<47; i++) { bars[i] = 0; } bars[0] = 1; bars[1] = 0; bars[2] = 1; bars[3] = 1; int addCheckSum = 3*EAN5[0] + 3*EAN5[2] + 3*EAN5[4]; addCheckSum += 9*EAN5[1] + 9*EAN5[3]; addCheckSum %= 10; for (int i=0; i<5; i++) { for (int j=0; j<7; j++) { bars[i*9 + 4 + j] = left[checksumTable[addCheckSum][i]][EAN5[i]][j]; } if (i<4) { bars[i*9 + 11] = 0; bars[i*9 + 12] = 1; } } return bars; } }