簡體   English   中英

如何在Java中將24字節bcd轉換為ascii?

[英]How to convert 24 byte bcd into ascii in java?

我想將24字節的BCD轉換為ASCII。我正在嘗試為此轉換編寫一些代碼,但我不確定如何進行數學運算。 有什么建議嗎?

這是我的輸入數據,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-> String轉換本質上與轉換為十六進制字符串相同,只是沒有af字符。

這個問題是Google索引中唯一出現的“ 24字節BCD”; 您的示例不是24個字節長,也不是BCD。 您期望給出的示例的ASCII形式是什么?

我想知道您的12字節示例實際上是否類似於ASN.1標簽,即“以下數據是24字節BCD”,而不是24字節BCD本身。

如果您將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),但希望您能理解(有關使用位運算符的詳細信息,請參見http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html) 。計算高和低)。

將BCD轉換為ASCII是什么意思? 基本上已經是ASCII了,您想要將0x73轉換為“ 73”,所以

左=(字符)(48+(A >> 4)); 右=(字符)(48+(A&15);輸出字符串+ = 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();
}

我不確定一個是否會比另一個獲得任何性能提升,因為我沒有對此進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM