如何在java中将24字节bcd转换为ascii?

时间:2010-05-19 12:21:29

标签: java

我想将24字节BCD转换为ASCII。我试图为此转换编写一些代码,但我不知道如何为它做数学运算。建议?

这是我的输入数据, cd00320000a4002a00001042 标签(24字节BCD)

6 个答案:

答案 0 :(得分: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字符。

答案 1 :(得分:1)

此问题是Google索引的'24字节BCD'的唯一出现;并且您的示例不是24字节长并且不是BCD。您期望您给出的示例的ASCII形式是什么?

我想知道你的12字节示例是否实际上类似于ASN.1标记,意思是“以下数据是24字节BCD”,而不是一段24字节BCD本身。

答案 2 :(得分:0)

如果你的意思是BCD是二进制编码的十进制,那么你只需要将每半个字节(有时称为nybble :))转换为一个十进制数字。如果你有一个输入数据的例子,那么我可以给你一个更具体的答案,但是这样的话:

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。)

答案 3 :(得分:0)

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

左=(char)(48+(A>> 4)); right =(char)(48+(A& 15); outputstring + = Character.toString(left)+ Character.toString(right);

答案 4 :(得分: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);

答案 5 :(得分: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();
}

我不确定一个人是否会比另一个人有任何性能提升,因为我没有测试过。