BCD编码解码问题

thekll 2005-12-03 11:18:11
BCD码就是用四个2进制位表示一个10进制数,尝试着写了两个转换函数,但在实际应用中总是出现问题,请大家指教一下~
java基础类库中有没有对应的方法?

...全文
361 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuzl32 2006-01-07
  • 打赏
  • 举报
回复
支持一下 thekll(silence) 最后的几句话!!
cscsuzjd 2006-01-07
  • 打赏
  • 举报
回复
谢谢你的方法,感觉不错
thekll 2005-12-04
  • 打赏
  • 举报
回复
移位有问题
thekll 2005-12-04
  • 打赏
  • 举报
回复
在一位搞硬件的同学提示下已解决,可能有更好的,也欢迎指正,贴出代码:
/**BCD码转为10进制串*/
public static String bcd2Str(byte[] bytes){
StringBuffer temp=new StringBuffer(bytes.length*2);
for(int i=0;i<bytes.length;i++){
temp.append((byte)((bytes[i]& 0xf0)>>>4));
temp.append((byte)(bytes[i]& 0x0f));
}
return temp.toString().substring(0,1).equalsIgnoreCase("0")?temp.toString().substring(1):temp.toString();
}

/**10进制串转为BCD码*/
public static byte[] str2Bcd(String str){
if(str.length()%2!=0)
str="0"+str;
StringBuffer sb=new StringBuffer(str);
ByteBuffer bb=ByteBuffer.allocate(str.length()/2);
int i=0;
while(i<str.length()){
bb.put((byte)((Integer.parseInt(sb.substring(i,i+1)))<<4|Integer.parseInt(sb.substring(i+1,i+2))));
i=i+2;
}
return bb.array();
}

PS:我不是每天来都来CSDN,不过这里的氛围实在不敢恭维,我觉得既然是技术论坛,大家最好多关注一下技术方面的问题,但我看到的一些回复率比较高的帖子反倒是一些和技术关系不大的帖子~
这社会很浮躁,但我想既然了选择了程序人生,就该舍弃一些东西,冷静一些,多钻研以下技术。
thekll 2005-12-03
  • 打赏
  • 举报
回复
搞了一天了:各位看看

public class TestBCD {

/**
* @param args
*/
public static void main(String[] args) {
System.out.println(bcd2Str(str2Bcd("150194342340")));
}

/**BCD码转为10进制串*/
public static String bcd2Str(byte[] bytes){
StringBuffer temp=new StringBuffer(bytes.length*2);
byte b1;
byte b2;
for(int i=0;i<bytes.length;i++){
// 以下代码之所以有一个三元运算是因为程序运行时8被编码解码以后变成了-8
b1=(byte)(bytes[i]>>>4)==-8?8:(byte)(bytes[i]>>>4);
b2=(byte)((byte)(bytes[i]<<4)>>>4)==-8?8:(byte)((byte)(bytes[i]<<4)>>>4);
// 以下代码之所以有一个三元运算是因为程序运行时9被编码解码以后变成了-7
temp.append(b1==-7?9:b1);
temp.append(b2==-7?9:b2);
}
return temp.toString().substring(0,1).equalsIgnoreCase("0")?temp.toString().substring(1):temp.toString();//去掉串首位零
}

/**10进制串转为BCD码*/
public static byte[] str2Bcd(String str){
if(str.length()%2!=0)
str="0"+str;
StringBuffer sb=new StringBuffer(str);
ByteBuffer bb=ByteBuffer.allocate(str.length()/2);
int i=0;
while(i<str.length()){
bb.put((byte)((Integer.parseInt(sb.substring(i,i+1)))<<4|Integer.parseInt(sb.substring(i+1,i+2))));
i=i+2;
}
return bb.array();
}

}
低调的小青蛙 2005-12-03
  • 打赏
  • 举报
回复
除了移位>>,<<,>>>以外,你还可以用 &, | 等操作,

a & 0x0F
a & 0xF0

然后再进行位移,就可以达到对半个字节进行操作
thekll 2005-12-03
  • 打赏
  • 举报
回复
java中处理数据的最小单位都是字节阿,对位的操作除了移位>>,<<,>>>以外还有别的操作吗?

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧