2010-05-19 28 views

回答

5

这将工作:

StringBuilder sb = new StringBuilder(bcdDigits.length * 2); 
for (byte b : bcdDigits) { 
    sb.append(String.format("%02x", b)); 
} 
System.out.println(sb.toString()); 

盒装BCD->字符串转换为基本上相同转换为十六进制字符串,只有没有a-f的字符。

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的为例),但希望你的想法(见http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html有关用于计算hi和lo的位运算符的详细信息)。

+0

嗨,这是我的输入数据,cd00320000a4002a00001042标签(24字节BCD) – lakshmi 2010-05-20 04:04:46

+0

对不起,我不是更清楚,我的意思是什么类型的数据存储,例如, byte [],int的最低有效字节,String等等。 – pdbartlett 2010-05-20 17:00:55

0

将BCD转换为ASCII码意味着什么?它本质上是ASCII码,你有类似0x73的东西,你想转换为“73”,所以做

left =(char)(48+(A >> 4));右=(char)的(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字节例子是不是真的像ASN.1标签,意思是'下面的数据是24字节的BCD',而不是24字节的BCD本身。