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

解决方案 »

  1.   

    java中处理数据的最小单位都是字节阿,对位的操作除了移位>>,<<,>>>以外还有别的操作吗?
      

  2.   

    除了移位>>,<<,>>>以外,你还可以用 &, | 等操作,a & 0x0F 
    a & 0xF0然后再进行位移,就可以达到对半个字节进行操作
      

  3.   

    搞了一天了:各位看看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();
    }}
      

  4.   

    在一位搞硬件的同学提示下已解决,可能有更好的,也欢迎指正,贴出代码:
    /**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,不过这里的氛围实在不敢恭维,我觉得既然是技术论坛,大家最好多关注一下技术方面的问题,但我看到的一些回复率比较高的帖子反倒是一些和技术关系不大的帖子~
    这社会很浮躁,但我想既然了选择了程序人生,就该舍弃一些东西,冷静一些,多钻研以下技术。
      

  5.   

    支持一下 thekll(silence) 最后的几句话!!