`
kissroom112
  • 浏览: 31348 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 字符串 进制之间的转换

阅读更多
最近项目中遇到一个问题:
String cardNum = "AC67D978";
,此时要求把cardNum转换为
cardNum = "2027513772"//十六进制0x78D967AC对应的十进制字符串
,考虑了好久,在同事的帮助下终于搞定,
不过并不知道这种方法是不是最佳,
/**
 * 将操作员编码替换为消费卡卡号(并转换为10进制)
 * @param cardNum  消费卡卡号(8字节)
 * @return reStr 返回值
 */
private static String byte2String(String cardNum) {
	String reStr = "001";//返回值
	try {
		if (cardNum.length() < 8) {
			throw new Exception("读取POS传送的消费卡卡号不足8位");
		}
		byte[] bs = cardNum.getBytes();
		byte[] b1 = new byte[bs.length];
		int[] b2 = new int[bs.length / 2];
		for (int i = 0; i < bs.length; i++) {//计算出cardNum中每一个字符对应的十进制
			if (bs[i] >= 'A' || bs[i] >= 'a') {
				b1[i] = (byte) (bs[i] - 0x30 - 7);
			} else {
				b1[i] = (byte) (bs[i] - 0x30);
			}
		}
		b2[0] = b1[6] << 4 | (b1[7] & 0x0f);//例:得到120(0x78)
		b2[1] = b1[4] << 4 | (b1[5] & 0x0f);//例:得到217(0xD9)
		b2[2] = b1[2] << 4 | (b1[3] & 0x0f);//例:得到103(0x67)
		b2[3] = b1[0] << 4 | (b1[1] & 0x0f);//例:得到172(0xAC)
			
		reStr = (b2[0] << 24 | b2[1] << 16 | b2[2] << 8 | b2[3]) + "";//得到2027513772(0x78D967AC)
	} catch (Exception e) {
		logger.error(e.getMessage(), e);
		return reStr;
	}
	return reStr;
	}
分享到:
评论
27 楼 racnow 2010-07-24  
fyf_008 写道
racnow 写道


这种问题您也好意思考? 无非就是autoboxing,int能向上转型为double,而Integer不能转为Double







看的懂我的解答而已。。。。不见得真知道。。。



嗯,谢谢啊,还好是您让我学了这么高深的知识,您这种高人真是少见啊
26 楼 fyf_008 2010-06-24  
racnow 写道


这种问题您也好意思考? 无非就是autoboxing,int能向上转型为double,而Integer不能转为Double







看的懂我的解答而已。。。。不见得真知道。。。

25 楼 racnow 2010-06-24  
fyf_008 写道


考你个问题。别说别个。


class A{
public static void m(Double d){
}

}
class B{
public static void m(double d){

}
}


能不能调用
A.m(12);

B.m(new Integer(12));

关键是why?



这种问题您也好意思考? 无非就是autoboxing,int能向上转型为double,而Integer不能转为Double
24 楼 beneo 2010-06-23  
fyf_008 写道
beneo 写道
首先呢,表激动

其次
    public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }


不是任何情况都会new的,所有的基本形也都类似。

最后,我没看动你说的
引用
还有,你觉得这两行代码有区别??


首先,

不是讨论 int>Integer 或Integer>int

讨论的是int>Double Integer>double

第二
IntegerCache.cache[i + 128];
不过是维持了个 Integer 对象在里面,这个维持的对象, 一样是 new 出来的。
###
   这里讨论的是, Java 在什么情况下 装箱或 拆箱,
   即,什么条件,将促使Java进行,装拆的行为?
###
至于怎么装,那不是问题。没有任何讨论价值。




我好奇为啥就得讨论你的问题呢?
23 楼 fyf_008 2010-06-23  
beneo 写道
首先呢,表激动

其次
    public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }


不是任何情况都会new的,所有的基本形也都类似。

最后,我没看动你说的
引用
还有,你觉得这两行代码有区别??


首先,

不是讨论 int>Integer 或Integer>int

讨论的是int>Double Integer>double

第二
IntegerCache.cache[i + 128];
不过是维持了个 Integer 对象在里面,这个维持的对象, 一样是 new 出来的。
###
   这里讨论的是, Java 在什么情况下 装箱或 拆箱,
   即,什么条件,将促使Java进行,装拆的行为?
###
至于怎么装,那不是问题。没有任何讨论价值。


22 楼 beneo 2010-06-23  
首先呢,表激动

其次
    public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }


不是任何情况都会new的,所有的基本形也都类似。

最后,我没看动你说的
引用
还有,你觉得这两行代码有区别??
21 楼 fyf_008 2010-06-23  
还有,你觉得这两行代码有区别??


1:   Double d= 12;

2:  public void m(Double d2){
XXXX
}

m(12);



d2 和 d有区别?? 只是范围,生命周期的区别....
20 楼 fyf_008 2010-06-23  
我无语了。。。。

楼上的问题都看不懂,还敢发表意见?

int 装箱后 是不是 Integer对象?

Double d;
能不能给他赋值个 Integer的实例。


还有,你说的垃圾问题 ,是 new 还是什么 valueOf();
这不过,里面new 还是外面new的问题。看书别看傻了。


Integer.valueOf(int a){
XXX 代码
YYY 代码
 return new Integer(a);// 无论如何,得 new !
}


19 楼 beneo 2010-06-22  
我查阅了JLS,里面没有规定用什么方法boxing或者unboxing。

http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#190697

不过,我看了一下bytecode,的确有
#8; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

此外
Integer a = 12;
Integer b = 12;

a == b is true;
a = 128, b = 128
a == b is false;
也能很好的说明这一点

不过,感觉我们2个谈论的问题貌似不在一个点上。。
18 楼 mercyblitz 2010-06-22  
beneo 写道
mercyblitz 写道
fyf_008 写道
现在解答。。楼上完全不对。。。。

这个要去分析 虚拟机行为,就是Java的作者怎么去设计这个问题。

Java有自动 装箱和拆箱的行为,这个确实。

但是问题是怎么装,怎么拆?

当 m(Double d);

调用 m(12);的时候,

java 发现,12为基本类型, 而Double 为类,

这时候 主动 装箱, 12 的封装类对象是new Integer(12);

但是 ,Integer 的实例是不可以给Double 的引用的。

如,Double d=new Integer(12); 错,所以不行。

反过来 当 m(double d)
调用 m(new Integer(12));

java 自动拆箱, Integer 拆箱后为基本的 int类型。

但是int 是何以赋值给double的。

如 double d= 12; 对

看下面的例子:

Double d= 12;错误
double d=new Integer(12); 正确



所以
B.m(new Integer(12)); 可以
A.m(12); 不可以


你的说法也不完全对。

首先,
引用
12 的封装类对象是new Integer(12);


int装箱到Integer,使用的是valueOf(int)方法,而不是new,并且在-127-128的范围中,使用的是缓存。

引用
A.m(12); 不可以


是因为int的12不能向上转型成double,而并非去装箱到Integer。

int a=12,double d=a;再调用A.m方法,就可以了。

int -> double 不行,double -> int 可以。




new Integer() 出来的还是对象,只不过这个對象的值被预先缓存起来了而已。

反过来说,所有的基本形都有缓存,new一下有的返回缓存,有的返回对象,岂不是乱套了?

那我再举例子

    static class A {
        public static void check(Integer d) {
            System.out.println("Integer");
        }

        public static void check(int d) {
            System.out.println("int");
        }
    }


A.check(12); A.check(new Integer(12));

我想前者返回的是 int, 后面的是Integer


可能有点误会,装箱是调用valueOf方法,这是JLS规定的。
17 楼 beneo 2010-06-22  
mercyblitz 写道
fyf_008 写道
现在解答。。楼上完全不对。。。。

这个要去分析 虚拟机行为,就是Java的作者怎么去设计这个问题。

Java有自动 装箱和拆箱的行为,这个确实。

但是问题是怎么装,怎么拆?

当 m(Double d);

调用 m(12);的时候,

java 发现,12为基本类型, 而Double 为类,

这时候 主动 装箱, 12 的封装类对象是new Integer(12);

但是 ,Integer 的实例是不可以给Double 的引用的。

如,Double d=new Integer(12); 错,所以不行。

反过来 当 m(double d)
调用 m(new Integer(12));

java 自动拆箱, Integer 拆箱后为基本的 int类型。

但是int 是何以赋值给double的。

如 double d= 12; 对

看下面的例子:

Double d= 12;错误
double d=new Integer(12); 正确



所以
B.m(new Integer(12)); 可以
A.m(12); 不可以


你的说法也不完全对。

首先,
引用
12 的封装类对象是new Integer(12);


int装箱到Integer,使用的是valueOf(int)方法,而不是new,并且在-127-128的范围中,使用的是缓存。

引用
A.m(12); 不可以


是因为int的12不能向上转型成double,而并非去装箱到Integer。

int a=12,double d=a;再调用A.m方法,就可以了。

int -> double 不行,double -> int 可以。




new Integer() 出来的还是对象,只不过这个對象的值被预先缓存起来了而已。

反过来说,所有的基本形都有缓存,new一下有的返回缓存,有的返回对象,岂不是乱套了?

那我再举例子

    static class A {
        public static void check(Integer d) {
            System.out.println("Integer");
        }

        public static void check(int d) {
            System.out.println("int");
        }
    }


A.check(12); A.check(new Integer(12));

我想前者返回的是 int, 后面的是Integer
16 楼 mercyblitz 2010-06-22  
fyf_008 写道
现在解答。。楼上完全不对。。。。

这个要去分析 虚拟机行为,就是Java的作者怎么去设计这个问题。

Java有自动 装箱和拆箱的行为,这个确实。

但是问题是怎么装,怎么拆?

当 m(Double d);

调用 m(12);的时候,

java 发现,12为基本类型, 而Double 为类,

这时候 主动 装箱, 12 的封装类对象是new Integer(12);

但是 ,Integer 的实例是不可以给Double 的引用的。

如,Double d=new Integer(12); 错,所以不行。

反过来 当 m(double d)
调用 m(new Integer(12));

java 自动拆箱, Integer 拆箱后为基本的 int类型。

但是int 是何以赋值给double的。

如 double d= 12; 对

看下面的例子:

Double d= 12;错误
double d=new Integer(12); 正确



所以
B.m(new Integer(12)); 可以
A.m(12); 不可以


你的说法也不完全对。

首先,
引用
12 的封装类对象是new Integer(12);


int装箱到Integer,使用的是valueOf(int)方法,而不是new,并且在-127-128的范围中,使用的是缓存。

引用
A.m(12); 不可以


是因为int的12不能向上转型成double,而并非去装箱到Integer。

int a=12,double d=a;再调用A.m方法,就可以了。

int -> double 不行,double -> int 可以。


15 楼 chenkan2000 2010-06-22  
请写清楚JVM版本。
14 楼 llfzy 2010-06-22  
   :不好解释的啊
13 楼 fyf_008 2010-06-22  
现在解答。。楼上完全不对。。。。

这个要去分析 虚拟机行为,就是Java的作者怎么去设计这个问题。

Java有自动 装箱和拆箱的行为,这个确实。

但是问题是怎么装,怎么拆?

当 m(Double d);

调用 m(12);的时候,

java 发现,12为基本类型, 而Double 为类,

这时候 主动 装箱, 12 的封装类对象是new Integer(12);

但是 ,Integer 的实例是不可以给Double 的引用的。

如,Double d=new Integer(12); 错,所以不行。

反过来 当 m(double d)
调用 m(new Integer(12));

java 自动拆箱, Integer 拆箱后为基本的 int类型。

但是int 是何以赋值给double的。

如 double d= 12; 对

看下面的例子:

Double d= 12;错误
double d=new Integer(12); 正确



所以
B.m(new Integer(12)); 可以
A.m(12); 不可以
12 楼 singleant 2010-06-22  
fyf_008 写道
racnow 写道
没想到javaeye已经沦落至此了


考你个问题。别说别个。


class A{
public static void m(Double d){
}

}
class B{
public static void m(double d){

}
}


能不能调用
A.m(12);

B.m(new Integer(12));

关键是why?




可以调用的,duble和Double是自动拆箱和解箱的,编译时会做处理的。
Integer和Double是向上兼容的,所以B.m(new Integer(12));也是可以的,编译器会处理掉。

不知道理解是否有误
11 楼 daybybyby 2010-06-22  
beneo 写道
fyf_008 写道
racnow 写道
没想到javaeye已经沦落至此了


考你个问题。别说别个。


class A{
public static void m(Double d){
}

}
class B{
public static void m(double d){

}
}


能不能调用
A.m(12);

B.m(new Integer(12));

关键是why?



如果知道原因的话不如说一下把


第一个错误,是因为在装箱时,必须是本类型的吧?

第二个正确是不是因为封装以后的类型是可以当作基本类型进行转型吧?
10 楼 beneo 2010-06-22  
fyf_008 写道
racnow 写道
没想到javaeye已经沦落至此了


考你个问题。别说别个。


class A{
public static void m(Double d){
}

}
class B{
public static void m(double d){

}
}


能不能调用
A.m(12);

B.m(new Integer(12));

关键是why?



如果知道原因的话不如说一下把
9 楼 fyf_008 2010-06-22  
racnow 写道
没想到javaeye已经沦落至此了


考你个问题。别说别个。


class A{
public static void m(Double d){
}

}
class B{
public static void m(double d){

}
}


能不能调用
A.m(12);

B.m(new Integer(12));

关键是why?

8 楼 racnow 2010-06-21  
没想到javaeye已经沦落至此了

相关推荐

    java String 与各种进制字符之间的转换

    在Java编程语言中,String类是处理文本字符串的核心类,而与各种进制字符之间的转换是常见的编程需求。本文将详细探讨Java中如何进行String与二进制、八进制、十进制以及十六进制之间的转换。 首先,我们要了解进制...

    Java实现任意进制的转换

    在Java中,我们可以使用`Integer`类的`toHexString`方法,将一个整数的二进制表示转换为十六进制字符串。例如: ```java int binaryNumber = 0b101010; // 二进制数 String hexString = Integer.toHexString(binary...

    Java实现的进制转换工具类完整示例

    Java实现的进制转换工具类是Java语言中的一种常用工具类,用于实现各种进制之间的转换操作,如二进制、十六进制、字符串、数组等。该工具类主要提供了将字节数组转换为十六进制字符数组或字符串的方法,以及将字符串...

    java16进制与字符串的转换.pdf

    本文将详细介绍 Java 中的 16 进制与字符串的相互转换函数分类。 将 byte 数组以 16 进制的形式打印到控制台 在 Java 中,我们可以使用 `printHexString` 函数将 byte 数组以 16 进制的形式打印到控制台。该函数...

    java 字符串转16进制Ascii

    在Java编程语言中,将字符串转换为16进制ASCII值是一个常见的操作,尤其是在处理数据编码、网络通信或存储时。这个过程涉及到字符到数字的转换,并且通常使用`Character`类和`Integer`类的方法来完成。让我们深入...

    javascript实现的字符串与十六进制表示字符串相互转换方法

    本文实例讲述了javascript实现的字符串与十六进制表示字符串相互转换方法。分享给大家供大家参考。具体如下: 之所以写这个,是因为发现SQL注入和XSS中经常利用十六进制表示的字符串,比如 SELECT CONCAT(0x68656c6...

    java字符串的各种编码转换

    ### Java字符串的编码转换 在Java中,处理不同字符集之间的字符串转换是一项常见任务。尤其是在处理国际化应用时,理解并掌握各种字符编码格式变得尤为重要。下面将介绍几种常见的字符编码格式以及如何在Java中实现...

    java实现各进制之间转换

    例如,将二进制字符串"1011"转换为八进制: ```java String binary = "1011"; int decimal = Integer.parseInt(binary, 2); // 将二进制转换为十进制 String octal = Integer.toOctalString(decimal); // 将十...

    java实现字符转换成十六进制的ASCII码

    在Java编程语言中,将字符转换为十六进制表示的ASCII码是一项常见的任务,尤其是在处理字符串数据时。本文将深入探讨如何实现这个功能,并通过一个具体的示例代码`StringToAscii.java`进行演示。 首先,我们需要...

    android字符串和16进制转换

    在这里,`String.format()`和`BigInteger`用于将字符串转换为16进制,而`Base64.getDecoder().decode()`则用于将16进制字符串解码回原始的字节数组,再转化为字符串。 在实际应用中,你可能还会遇到其他复杂情况,...

    Java进制转换方法整理

    一、利用Integer将十进制的数进行进制转换 方法 十进制转换其他进制 使用方法 返回值 10进制转2进制 Integer.toBinaryString(n) 一个二进制字符串 10进制转8进制 Integer.toOctalString(n) 一个八进制字符...

    JAVA二进制字节数组字符十六进制BCD编码转换.doc

    1. **二进制与十六进制转换** - 二进制是一种基于2的计数系统,只包含两个数字:0和1。 - 十六进制是一种基于16的计数系统,由0-9的阿拉伯数字和A-F的字母(代表10-15)组成。 - 在Java中,可以使用`Integer....

    java实现十六进制字符unicode与中英文转换示例

    本示例探讨了如何使用Java实现从Unicode十六进制字符串到中英文字符的转换,以及反过来的过程。理解Unicode和UTF之间的关系是至关重要的。 Unicode是一个国际标准,它为世界上几乎所有的字符提供了一个唯一的数字...

    Base16 java字符串与十六进制互转 js字符串与十六进制互转

    在Java中,我们可以使用`java.util.HexFormat`类(Java 11及以上版本)或者`java.security.MessageDigest`配合`java.math.BigInteger`来实现十六进制转换。如果你使用的是早期版本的Java,可以自定义方法: ```java...

    java二进制,字节数组,字符,十六进制,BCD编码转换

    /* java二进制,字节数组,字符,十六进制,BCD编码转换2007-06-07 00:17/** *//** * 把16进制字符串转换成字节数组 * @param hex * @return */

    二进制与字符串之间的转换类CBinary

    在编程中,有时我们需要在二进制和字符串之间进行转换,以满足不同场景的需求。`CBinary`类就是为了实现这种转换而设计的。 `CBinary`类可能包含以下功能: 1. **二进制转字符串**:将二进制数据转换为字符串。这...

    Java编写的进制转换程序

    本项目就是一个基于Java原生SDK编写的进制转换程序,它旨在帮助学习者理解和掌握数据结构的相关概念。 在Java中,进制转换主要涉及到`Integer`和`String`类中的方法。以下是主要涉及的知识点: 1. **字符串到整数...

    java进制转换工具类

    二进制数组转换为二进制字符串 将二进制数组转换为十六进制字符串 将十六进制转换为二进制字节数组 将十六进制转换为二进制字符串

    字符串16进制转10进制

    在计算机编程中,字符串的16进制转10进制是一个常见的字符转换操作,特别是当处理二进制数据或在编程调试过程中遇到16进制数据时。16进制数,也称为十六进制数,是一种逢16进位的数制,使用数字0-9和字母A-F(或小写...

    java中进制转换(二进制,十进制,十六进制)及字节数组与十六进制的转换

    本篇将详细阐述如何在Java中进行二进制、十进制和十六进制之间的转换,以及字节数组与十六进制字符串的相互转换。 一、进制转换 1. **二进制转十进制**:Java中可以使用`Integer.parseInt()`或`Long.parseLong()`...

Global site tag (gtag.js) - Google Analytics