Notice
Recent Posts
Recent Comments
Link
투케이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바이트 만으로 표시할 수 있습니다 (용량감소)
/* =========================== */
반응형
'Java' 카테고리의 다른 글
109. (java/자바) 사용자로부터 사칙연산자 +, -, *, / 값을 입력 받은 후 연산 수행 실시 (1) | 2021.01.10 |
---|---|
108. (java/자바) 리틀엔디안(little endian), 빅엔디안(big endian) 데이터 포맷 수행 실시 (0) | 2021.01.10 |
106. (java/자바) 문자열 데이터를 base64로 인코딩(암호화), 디코딩(복호화) 수행 실시 (0) | 2021.01.10 |
105. (java/자바) 구구단 출력 - 사용자로부터 단을 입력받아 for문 사용해 출력 실시 (0) | 2021.01.09 |
104. (java/자바) 알고리즘 : queue 큐 방식으로 배열에 데이터 삽입 및 삭제 실시 (0) | 2021.01.09 |
Comments