我想將24字節BCD轉換爲ASCII.Im試圖爲此轉換寫一些代碼,但我不知道如何爲它做數學。建議?如何在java中將24字節的bcd轉換爲ascii?
這是我的輸入數據, cd00320000a4002a00001042 標籤(24字節BCD)
我想將24字節BCD轉換爲ASCII.Im試圖爲此轉換寫一些代碼,但我不知道如何爲它做數學。建議?如何在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->字符串轉換爲基本上相同轉換爲十六進制字符串,只有沒有a-f的字符。
如果你的意思是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的位運算符的詳細信息)。
嗨,這是我的輸入數據,cd00320000a4002a00001042標籤(24字節BCD) – lakshmi 2010-05-20 04:04:46
對不起,我不是更清楚,我的意思是什麼類型的數據存儲,例如, byte [],int的最低有效字節,String等等。 – pdbartlett 2010-05-20 17:00:55
將BCD轉換爲ASCII碼意味着什麼?它本質上是ASCII碼,你有類似0x73的東西,你想轉換爲「73」,所以做
left =(char)(48+(A >> 4));右=(char)的(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字節例子是不是真的像ASN.1標籤,意思是'下面的數據是24字節的BCD',而不是24字節的BCD本身。
這是一個ASN.1編碼嗎? – msandiford 2010-05-21 12:48:01