最近做一个报文解析的事情,碰到了BCD码解析的问题。
BCD 二进码十进数(Binary-Coded Decimal)
什么意思呢?就是用半个字节(4位)的二进制来表示一个十进制的数字。
1001 0110
前四位 1001 表示十进制的 9
后四位 0110 表示十进制的 6
- 下面是需求
“事件时间,采用BCD码,如不足8字节,前面补0,如2011年6月1日12点10分20秒记录格式为20110601121020” 需求是这样,我要把一堆二进制的字节数组转成时间。
因为用的是Netty所以很容易获得我们想要的字节数组。取到了字节数组就要进行关键的一步了,就是把它转成字符串。
思路就是:把一个字节分成两半,高四位转换成一个数,低四位转换成一个数。
如下面的代码:
public static String bcd2Str(byte[] bytes) {
StringBuffer result = new StringBuffer(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
// 一个字节的高四位 这里用& 就是把低四位变成0
result.append((byte) ((bytes[i] & 0xf0) >>> 4));
// 低四位 & 把高四位变成0
result.append((byte) (bytes[i] & 0x0f));
}
return result.toString().substring(0, 1).equalsIgnoreCase("0") ? result
.toString().substring(1) : result.toString();
}