2010-05-19 4 views
0

24 바이트 BCD를 ASCII로 변환하려고합니다.이 변환을위한 코드를 작성하려고하지만 Im을 위해 수학을 수행하는 방법을 모르겠습니다. 제안? Java에서 ascii로 24 바이트 bcd를 변환하는 방법?

내 입력 데이터입니다 cd00320000a4002a00001042 태그 (24 바이트의 BCD)

+0

이것은 ASN.1 인코딩입니까? – msandiford

답변

5

이 작동합니다 :

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 진수 문자열로 변환과 동일합니다.

0

이진 소수점을 코딩 당신은 방금로 각 반 바이트 (때로는 :) 니블라고 함)로 변환 할 필요가 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을 참조하십시오.

+0

안녕하세요 이것은 입력 데이터입니다. cd00320000a4002a00001042 태그 (24 바이트 BCD) – lakshmi

+0

죄송합니다. 명확하지 않았습니다. 데이터 유형이 저장되었습니다. byte [], int, String 등의 3 개의 최하위 바이트 – pdbartlett

0

BCD를 ASCII로 변환하면 무엇을 의미합니까? 그것은 본질적으로 ASCII이기 때문에, "73"으로 변환하려는 0x73과 같은 것이 있습니다.

왼쪽 = (char) (48+ (A >> 4)); 오른쪽 = 샤아 (48+ (A & 15) outputstring + = Character.toString (왼쪽) + Character.toString (오른쪽)

0

에 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); 
0

두 가지 방법 내가 사용하는 생각할 수 있습니다 먼저 각각의 소수점 자리 꺼내 바이트의 두 가지 구성 요소에 대한 간단한 스위치를 사용할 수 있습니다.

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(); 
} 

테스트하지 않았기 때문에 성능이 향상되는지 확실하지 않습니다.

1

이 질문은 Google에서 색인 생성하는 '24 바이트 BCD '의 유일한 발생입니다. 귀하의 예제는 24 바이트 길이가 아니며 BCD가 아닙니다. 당신이 준 예제의 ASCII 형식은 무엇을 기대합니까?

12 바이트 예제가 실제로 24 바이트 BCD 그 자체가 아니라 '다음 데이터는 24 바이트 BCD'를 의미하는 ASN.1 태그와 같은 것인지 궁금합니다.

관련 문제