투케이2K

107. (java/자바) string(정수값) to bcd, bcd to String(정수값) 포맷 - bcd 포맷을 수행해 정수값을 바이트값으로 변환 실시 본문

Java

107. (java/자바) string(정수값) to bcd, bcd to String(정수값) 포맷 - bcd 포맷을 수행해 정수값을 바이트값으로 변환 실시

투케이2K 2021. 1. 10. 14:02

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : Eclipse

개발 언어 : Java

/* =========================== */

/* =========================== */

[소스 코드]

 

package AI3;

import java.util.Arrays;

public class MainActivity12 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("[string(정수값) to bcd, bcd to String(정수값) 포맷 - bcd 포맷을 수행해 정수값을 바이트값으로 변환 실시]");
		
		/*[설 명]
		 * 1. bcd 란 - 이진화된 십진수라는 의미입니다
		 * 2. bcd는 십진수 0 ~ 9까지 숫자를 사용합니다
		 * 3. 사용이유 - 원본 2000 이란 데이터를 바이트로 변환하면 4바이트 공간을 사용하게되는데,
		 *            bcd 포맷을 사용하면 2바이트 만으로 표시할 수 있습니다 (용량감소)
		 */
		String data = "2000";
		System.out.println("string to bcd [원본 - 문자열] : "+data);
		System.out.println("string to bcd [파싱 - 바이트] : "+Arrays.toString(getStringToBcd(data)));
		System.out.println("string to bcd [파싱 - Hex] : "+getByteToHex(getStringToBcd(data)));
		System.out.println("");
		
		byte arr[] = {32, 0};
		System.out.println("bcd to string [원본 - 바이트] : "+Arrays.toString(getStringToBcd(data)));
		System.out.println("bcd to string [파싱 - 문자열] : "+getBcdToString(arr));

	}//메인 종료	
	
	// ==== Bcd 데이터를 String 값으로 포맷 수행 ====
	public static String getBcdToString(byte[] data) {
		String str = "";    	
		for(int i=0; i<data.length; i++) {
			int value = 0;
			value = ((data[i]/16*10) + (data[i]%16)); //00이면 정수로 0으로 인식됨    		
			str += String.format("%02X", data[i]); //x가 소문자면 소문자 출력 / 대문자면 대문자 출력
		}    	
		return String.valueOf(Integer.parseInt(str));
	}
	
	// ==== String 값을 Bcd로 포맷 수행 ====
	public static byte[] getStringToBcd(String data) {
		boolean NumPandan = true;
		for(int i=0; i<data.length(); i++) {
			char num = data.charAt(i);
			if(Character.isDigit(num) == false) { //정수 판단 여부 (bcd는 0~9까지 정수 사용)
				NumPandan = false;
			}			
		}
		if(NumPandan == true) { //모두 정수로 된 경우
			long num = Integer.parseInt(data);
			int digits = 0;
			long temp = num;
			while (temp != 0) {
				digits++;
				temp /= 10;
			}
			
			int byteLen = 0;
						
			if((data.length()%2) == 0) { // 짝수				
				byteLen = data.length()/2;
			}
			else { //홀수				
				byteLen = (data.length()/2)+1;
			}
						
			boolean isOdd = digits % 2 != 0;
			byte bcd[] = new byte[byteLen];
			for (int i = 0; i < digits; i++) {
				byte tmp = (byte) (num % 10);
				if (i == digits - 1 && isOdd)
					bcd[i / 2] = tmp;
				else if (i % 2 == 0)
					bcd[i / 2] = tmp;
				else {
					byte foo = (byte) (tmp << 4);
					bcd[i / 2] |= foo;
				}
				num /= 10;
			}
			for (int i = 0; i < byteLen / 2; i++) {
				byte tmp = bcd[i];
				bcd[i] = bcd[byteLen - i - 1];
				bcd[byteLen - i - 1] = tmp;
			}
			return bcd;
		}
		else {
			System.out.println("BCD 코드 포맷 에러 - 문자포함됨");
			byte bcd[] = new byte[0];
			return bcd;
		}				
	}
	
	// ==== 바이트 배열에 저장된 값을 hex 표현 ====
	public static String getByteToHex(byte buf[]) { 
    		String Hex_Value = "";
	    	for(int i=0; i<buf.length; i++) {
    			Hex_Value += String.format("0x%02x ", buf[i]); //x가 소문자면 소문자 출력 / 대문자면 대문자 출력
	    	}    
	    	return Hex_Value;
	}

}//클래스 종료

/* =========================== */

[결과 출력]

[string(정수값) to bcd, bcd to String(정수값) 포맷 - bcd 포맷을 수행해 정수값을 바이트값으로 변환 실시]

string to bcd [원본 - 문자열] : 2000

string to bcd [파싱 - 바이트] : [32, 0]

string to bcd [파싱 - Hex] : 0x20 0x00

bcd to string [원본 - 바이트] : [32, 0]

bcd to string [파싱 - 문자열] : 2000

/* =========================== */

/* =========================== */

[요약 설명]

* 1. bcd 란 - 이진화된 십진수라는 의미입니다

* 2. bcd는 십진수 0 ~ 9까지 숫자를 사용합니다

* 3. 사용이유 - 원본 2000 이란 데이터를 바이트로 변환하면 4바이트 공간을 사용하게되는데,

bcd 포맷을 사용하면 2바이트 만으로 표시할 수 있습니다 (용량감소)

/* =========================== */

반응형
Comments