2012-04-26 6 views
0

EAN-13数字からバイト配列を作成する必要があります。 ここで私はどのように説明するのですか?http://en.wikipedia.org/wiki/International_Article_Number_%28EAN%29#Binary_encoding_of_data_digits_into_EAN-13_barcodeバーコードEAN-13からバイナリ

誰かがこのアルゴリズムを作成しているのでしょうか?シェアしてください。

+0

含まれるはずのバイト配列は何ですか?各ビットは水平軸に沿って1ピクセルを表すべきですか?はいの場合は、バーコードの両側にも必須の空白が含まれている必要がありますか? – Codo

+0

私はただ知っています:1)バーコードタイプBitLine; 2)バーコード4821111111111は、バイト[] b = {0x30,0x30,0x35,0x36,0x45,0x36,0x43,0x43,0x39,0x36,0x36,0x43,0x44,0x35,0x39,0x42,0x33,0x36,0x36} 、0x43、0x44、0x39、0x42、0x33、0x35、0x30、0x30、0x30、0x30、0x30、0x30} – smie

+0

実際には、バイト配列は16進文字の配列です(ASCII形式)。これは、次の文字列を表します:0056e6cc9966cd59b366cd9b35000000。この文字列を16バイトのバイナリデータに変換すると、バーコードのピクセルパターンが実際に含まれます。バーコードは、9ビットのゼロビットの後に開始し、24ビットのゼロビットで終了します。 – Codo

答えて

0

次のコードは、EAN-13バーコードをエンコードできます。 funnyEncodeメソッドは、必要と思われる特別なバージョンです。

public class EAN13Encoder { 

    public static void main(String[] args) { 
     byte[] result = encode(4821111111111L); 
     result = funnyEncode(4821111111111L); 
    } 

    public static byte[] encode(long ean) { 
     EAN13Encoder encoder = new EAN13Encoder(12); 
     encoder.buildBars(getDigitArray(ean)); 
     return encoder.getByteArray(); 
    } 

    public static byte[] funnyEncode(long ean) { 
     EAN13Encoder encoder = new EAN13Encoder(16); 
     encoder.moveBitPos(9); 
     encoder.buildBars(getDigitArray(ean)); 
     byte[] byteArray = encoder.getByteArray(); 
     return hexEncode(byteArray); 
    } 

    private byte[] byteArray; 
    private int bitPos = 0; 

    private EAN13Encoder(int byteArrayLength) { 
     byteArray = new byte[byteArrayLength]; 
    } 

    private byte[] getByteArray() { 
     return byteArray; 
    } 

    private void moveBitPos(int diff) { 
     bitPos += diff; 
    } 

    public static int[] getDigitArray(long ean) { 
     int[] digitArray = new int[13]; 
     int index = 12; 
     while (ean > 0) { 
      digitArray[index] = (int)(ean % 10); 
      ean = ean/10; 
      index--; 
     } 
     return digitArray; 
    } 

    private void buildBars(int[] digitArray) { 
     // left synchronization bars 
     addBits(3, 0x05); 

     // left half 
     int firstDigit = digitArray[0]; 
     int lg_switch = LG_SWITCH[firstDigit]; 
     for (int i = 0; i < 6; i++) { 
      int digit = digitArray[i + 1]; 
      int pattern = (lg_switch & (0x20 >> i)) == 0 ? L_BARS[digit] : G_BARS[digit]; 
      addBits(7, pattern); 
     } 

     // middle synchronization bars 
     addBits(5, 0x0a); 

     // right half 
     for (int i = 0; i < 6; i++) { 
      int digit = digitArray[i + 7]; 
      int pattern = R_BARS[digit]; 
      addBits(7, pattern); 
     } 

     // right synchronization bars 
     addBits(3, 0x05); 
    } 

    private void addBits(int numBits, int pattern) { 
     int currentBytePos = bitPos >> 3; 
     int remainingBits = 8 - (bitPos & 0x07); 
     byte currentByte = byteArray[currentBytePos]; 
     if (numBits <= remainingBits) { 
      currentByte = (byte)(currentByte | (pattern << (remainingBits - numBits))); 
     } else { 
      currentByte = (byte)(currentByte | (pattern >> (numBits - remainingBits))); 
      byteArray[currentBytePos] = currentByte; 
      currentBytePos++; 
      currentByte = (byte)(pattern << (8 - (numBits - remainingBits))); 
     } 
     byteArray[currentBytePos] = currentByte; 
     bitPos += numBits; 
    } 

    private static byte[] hexEncode(byte[] src) { 
     byte[] dest = new byte[src.length * 2]; 
     for (int i = 0; i < src.length; i++) { 
      dest[i * 2] = HEX_DIGITS[(src[i] & 0xff) >>> 4]; 
      dest[i * 2 + 1] = HEX_DIGITS[src[i] & 0x0f]; 
     } 
     return dest; 
    } 

    private static final int[] LG_SWITCH = { 0x00, 0x0b, 0x0d, 0x0e, 0x13, 0x19, 0x1c, 0x15, 0x16, 0x1a };  
    private static final int[] L_BARS = { 0x0d, 0x19, 0x13, 0x3d, 0x23, 0x31, 0x2f, 0x3b, 0x37, 0x0b }; 
    private static final int[] G_BARS = { 0x27, 0x33, 0x1b, 0x21, 0x1d, 0x39, 0x05, 0x11, 0x09, 0x17 }; 
    private static final int[] R_BARS = { 0x72, 0x66, 0x6c, 0x42, 0x5c, 0x4e, 0x50, 0x44, 0x48, 0x74 }; 
    private static final byte[] HEX_DIGITS = { 0x30, 0x31, 032, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }; 
} 
関連する問題