본문 바로가기

컴퓨터/Java

도서 바코드 데이터 추출 알고리즘

반응형

이 소스코드는 도서에서만 적용이 되는 것입니다. 물론 다른 바코드의 경우에도 EAN-13을 만족한다면 몇 가지 상수 값만 변환하면 바로 사용이 가능합니다. 여기에서는 따로 구현을 하지 않았습니다. 만약 다른 바코드로 사용을 하신다면 11번 줄과 31번 줄에 있는 데이터 값을 해당하는 값에 맞게 변환을 해주셔야 합니다.


사용방법은 Barcode개체를 생성할 때 인자로 바코드의 바이너리 데이터를 주기만 하면 되며, getData 메서드를 호출하면 그 바이너리 데이터를 변환해서 우리가 알아볼 수 있는 데이터로 확인이 가능합니다.


최적화를 신경쓰지 않고 만든 소스 코드라 약간 난잡해보일 수 있습니다. 역시 변수명을 정하는 것이 가장 어려운 문제인 것 같네요......


class Barcode
{
	private static final int[] CODE_L = {0xd, 0x19, 0x13, 0x3d, 0x23, 0x31, 0x2f, 0x3b, 0x37, 0xb};
	private static final int[] CODE_G = {0x27, 0x33, 0x1b, 0x21, 0x1d, 0x39, 0x5, 0x11, 0x9, 0x17};
	private static final int[] CODE_R = {0x72, 0x66, 0x6c, 0x42, 0x5c, 0x4e, 0x50, 0x44, 0x48, 0x74};
	
	private static final int L_INDEX = 0;
	private static final int G_INDEX = 1;
	private static final int R_INDEX = 2;
	
	private static final int[] INDEX = {0, 1, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2}; // Can be changed.
	private static final int SPLIT_LEN = 7;
	
	private String binary_str = "";
	
	public Barcode(String str){
		this.binary_str = str;
	}
	
	private int[] convertBinary(){
		int len = INDEX.length;
		int[] result = new int[len];
		for(int i=0; i<len; i++){
			result[i] = Integer.parseInt(this.binary_str.substring(SPLIT_LEN*i, SPLIT_LEN*(i+1)),2);
		}
		return result;
	}
	
	public String getData(){
		byte[] result = new byte[13];
		result[0] = '9'; // Can be changed.
		int[] binary_data = this.convertBinary();
		for(int i=0; i<INDEX.length; i++){
			int []code_arr = null;
			byte ch = 0;
			switch(INDEX[i]){
			case L_INDEX:
				code_arr = CODE_L;
				break;
			case G_INDEX:
				code_arr = CODE_G;
				break;
			case R_INDEX:
				code_arr = CODE_R;
				break;
			}
			for(int j=0; j<10; j++){
				if(code_arr[j]==binary_data[i]){
					ch = (byte)('0'+j);
					break;
				}
				if(ch==0){
					System.err.print("Cannot find!");
				}
			}
			result[i+1] = ch;
		}
		return new String(result);
	}

	public static void main (String[] args)
	{
		Barcode t = new Barcode("{Barcode binary}");

		System.out.print(t.getData());
	}
}



반응형

'컴퓨터 > Java' 카테고리의 다른 글

MongoDB에서 Between 쿼리 사용하기  (0) 2024.04.23
[프로그래밍, 자료구조] 큐(Queue)  (2) 2014.08.25
2048 ver 1.1  (0) 2014.06.04
Fibonacci number  (0) 2014.06.04
2048 ver 1.0  (0) 2014.06.04