BCD编码解码问题 BCD码就是用四个2进制位表示一个10进制数,尝试着写了两个转换函数,但在实际应用中总是出现问题,请大家指教一下~java基础类库中有没有对应的方法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 java中处理数据的最小单位都是字节阿,对位的操作除了移位>>,<<,>>>以外还有别的操作吗? 除了移位>>,<<,>>>以外,你还可以用 &, | 等操作,a & 0x0F a & 0xF0然后再进行位移,就可以达到对半个字节进行操作 搞了一天了:各位看看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(); }} 在一位搞硬件的同学提示下已解决,可能有更好的,也欢迎指正,贴出代码: /**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(silence) 最后的几句话!! jsmooth 奇怪问题,小女希望路过的进来看看 又一道爱立信面试题! 难到我发晕的问题!!求救 java程序运行时候默认导入那些包? 各位帮忙啊,,在ECLIPSE中查找替换操作的问题 关于JFrame和JDialog的问题 帮我看一下下面创建jdbc连接怎么会出错 各位请帮忙!java编译的问题!!! 如何做半透明的JMenuItem,有人会吗? SCJP 模拟题一道 Java读写COM端口问题 jdbc问题,急
a & 0xF0然后再进行位移,就可以达到对半个字节进行操作
* @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();
}}
/**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,不过这里的氛围实在不敢恭维,我觉得既然是技术论坛,大家最好多关注一下技术方面的问题,但我看到的一些回复率比较高的帖子反倒是一些和技术关系不大的帖子~
这社会很浮躁,但我想既然了选择了程序人生,就该舍弃一些东西,冷静一些,多钻研以下技术。