24 바이트 BCD를 ASCII로 변환하려고합니다.이 변환을위한 코드를 작성하려고하지만 Im을 위해 수학을 수행하는 방법을 모르겠습니다. 제안? Java에서 ascii로 24 바이트 bcd를 변환하는 방법?
이
내 입력 데이터입니다 cd00320000a4002a00001042 태그 (24 바이트의 BCD)24 바이트 BCD를 ASCII로 변환하려고합니다.이 변환을위한 코드를 작성하려고하지만 Im을 위해 수학을 수행하는 방법을 모르겠습니다. 제안? Java에서 ascii로 24 바이트 bcd를 변환하는 방법?
이
내 입력 데이터입니다 cd00320000a4002a00001042 태그 (24 바이트의 BCD)이 작동합니다 :
StringBuilder sb = new StringBuilder(bcdDigits.length * 2);
for (byte b : bcdDigits) {
sb.append(String.format("%02x", b));
}
System.out.println(sb.toString());
포장 BCD-은> 문자열 변환 만-F 문자 않고, 기본적으로 16 진수 문자열로 변환과 동일합니다.
이진 소수점을 코딩 당신은 방금로 각 반 바이트 (때로는 :) 니블라고 함)로 변환 할 필요가 BCD를 의미하는 경우 단일 십진수. 당신이 당신의 입력 데이터의 예를 가지고 있다면 나는 당신에게 더 구체적인 대답을 줄 수 있지만,이 같은 :
는 에게String s = "";
for (byte b : input) {
int hi = b >>> 4;
int lo = b & 0xF;
if (hi > 9 || lo > 9)
throw new IllegalArgumentException();
s = s + hi.toString() + lo.toString();
}
는 에게
분명하지만 잘하면 당신은 아이디어를 얻을 (예를 들어 모두 StringBuilder를 사용하여) 개선 될 수 있습니다 (참조 hi와 lo를 계산하는 데 사용되는 비트 연산자에 대한 자세한 내용은 http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html을 참조하십시오.
안녕하세요 이것은 입력 데이터입니다. cd00320000a4002a00001042 태그 (24 바이트 BCD) – lakshmi
죄송합니다. 명확하지 않았습니다. 데이터 유형이 저장되었습니다. byte [], int, String 등의 3 개의 최하위 바이트 – pdbartlett
BCD를 ASCII로 변환하면 무엇을 의미합니까? 그것은 본질적으로 ASCII이기 때문에, "73"으로 변환하려는 0x73과 같은 것이 있습니다.
왼쪽 = (char) (48+ (A >> 4)); 오른쪽 = 샤아 (48+ (A & 15) outputstring + = Character.toString (왼쪽) + Character.toString (오른쪽)
에 int 텍스트로 포맷으로 변환 예를 들어,
한다.public static int bcdToInt(final int bcd) {
int result = 0;
for (int i = 0; i < 8; i++) {
result += (0xF & bcd >> 4 * i) * (int)Math.pow(10,i);
}
return result;
}
int n = bcdToInt(bcd);
String text = String.format("%010d", n);
두 가지 방법 내가 사용하는 생각할 수 있습니다 먼저 각각의 소수점 자리 꺼내 바이트의 두 가지 구성 요소에 대한 간단한 스위치를 사용할 수 있습니다.
public static String bcdToString(byte[] bcd){
StringBuilder s = new StringBuilder(bcd.length*2);
char c = ' ';
for(byte b : bcd){
switch((b>>4)&0xF){
case 0: c = '0';break;
case 1: c = '1';break;
case 2: c = '2';break;
case 3: c = '3';break;
case 4: c = '4';break;
case 5: c = '5';break;
case 6: c = '6';break;
case 7: c = '7';break;
case 8: c = '8';break;
case 9: c = '9';break;
default: throw new IllegalArgumentException("Bad Decimal: "+((b>>4)&0xF));
}
s.append(c);
switch(b&0xF){
case 0: c = '0';break;
case 1: c = '1';break;
case 2: c = '2';break;
case 3: c = '3';break;
case 4: c = '4';break;
case 5: c = '5';break;
case 6: c = '6';break;
case 7: c = '7';break;
case 8: c = '8';break;
case 9: c = '9';break;
default: throw new IllegalArgumentException("Bad Decimal: "+(b&0xF));
}
s.append(c);
}
/* If you want to remove a leading zero:
if(s.charAt(0) == '0') return s.substring(1);
*/
return s.toString();
}
은 또한 당신이 사용할 수를 지도를 찾아 값을 검색하십시오 :
private static HashMap<Byte, String> digits = new HashMap<Byte, String>();
static{
for(byte b1=0;b1<10;b1++){
for(byte b2=0;b2<10;b2++){
digits.put((byte)((b1<<4)|b2), Byte.toString(b1)+Byte.toString(b2));
}
}
}
public static String bcdToString2(byte[] bcd){
StringBuilder s = new StringBuilder(bcd.length*2);
String tmp = null;
for(byte b : bcd){
tmp = digits.get(b);
if(tmp == null) throw new IllegalArgumentException("Bad bcd: "+Integer.toString(b, 16));
s.append(tmp);
}
/* If you want to remove a leading zero:
if(s.charAt(0) == '0') return s.substring(1);
*/
return s.toString();
}
테스트하지 않았기 때문에 성능이 향상되는지 확실하지 않습니다.
이 질문은 Google에서 색인 생성하는 '24 바이트 BCD '의 유일한 발생입니다. 귀하의 예제는 24 바이트 길이가 아니며 BCD가 아닙니다. 당신이 준 예제의 ASCII 형식은 무엇을 기대합니까?
12 바이트 예제가 실제로 24 바이트 BCD 그 자체가 아니라 '다음 데이터는 24 바이트 BCD'를 의미하는 ASN.1 태그와 같은 것인지 궁금합니다.
이것은 ASN.1 인코딩입니까? – msandiford