java十进制字符串转十六进制字符串

nlwangxin 2012-06-12 02:29:54
将字符串类型的十进制数(0527461410,2828718396)转换为十六进制的字符串(226c701f,3cd19aa8)
...全文
1291 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nlwangxin 2012-06-13
  • 打赏
  • 举报
回复
long类型的,如果第一位是0的话,转十六进制后的结果是正确的。int类型超了2,147,483,647就会报错。所以也不能用int类型。
这个问题我自己解决了。
public class Te {

public static void main(String[] args) {
// String str = "0527461410";
// String str = "2828718396";
String str = "2828718396";
long num = Long.parseLong(str);
String changeStr = decimalTo(num, 16);
System.out.println(changeStr);
}

/**
* 十进制整数 转换为 任何进制的数
*
* @param decimValue
* @param radix
* 表示基数
* @return
*/
public static String decimalTo(long decimValue, int radix) {
if (decimValue <= 0)
return "";
StringBuffer target = new StringBuffer();
long digit = dealer(decimValue, radix);
for (long i = digit; i > 0; i--) {
char j;
try {
j = getDigPosition(decimValue, radix, i - 1);
target.append(j);
decimValue -= Math.pow(radix, i - 1) * getIntFromChar(j);
// if (decimValue < radix)
// {
// target.append(getIntChar(decimValue));
// }
} catch (MyException e) {
e.printStackTrace();
}

}
// 转换后的进制字符串
String switchStr = target.toString();
String finalStr = getSwitchFormStr(switchStr);
return finalStr;
}

/**
* 获得转换后的位数 到底有多少个数位。
*
* @param value
* @param radix
* @return
*/
public static long dealer(long value, int radix) {
long i = 1;
while (true) {
double power = Math.pow(radix, i);
if (power > value) {
return i;
}
i++;
}
}

/**
* 获得指定数位上的值
*
* @param decimValue
* @param radix
* @param pow
* +1 表示第pow+1位上的值
* @return
* @throws MyException
*/
public static char getDigPosition(long decimValue, int radix, long pow)
throws MyException {
long i = 0;
while (true) {
if (Math.pow(radix, pow) * i > decimValue) {
break;
}
i++;
}
long result = i - 1;

return getCharFromInt(result);
}

public static int getIntFromChar(char c) {

if (c < 58)
return c - 48;
else if (Character.isLowerCase(c)) {
return c - 87;
}
return c - 55;
}

public static char getCharFromInt(long digit) throws MyException {
if (digit < 10)
return (char) (digit + 48);
else
return (char) (digit + 55);
// throw new MyException("必须是十六进制的数,不能大于15");
}

public static String getSwitchFormStr(String str) {
String switchStr = str.toLowerCase();
String str1 = switchStr.substring(0, 2);
String str2 = switchStr.substring(2, 4);
String str3 = switchStr.substring(4, 6);
String str4 = switchStr.substring(6, 8);
String finalStr = str4 + str3 + str2 + str1;
return finalStr;
}
}
magong 2012-06-12
  • 打赏
  • 举报
回复
楼主,你的10进制数和16进制数不相等,那你的真实意图是什么呢?
正常Java中10进制和16进制转换是比较简单的,如
long b = Long.parseLong("2828718396");
System.out.println(Long.toHexString(b));
不过结果应该是
a89ad13c
FFF9527 2012-06-12
  • 打赏
  • 举报
回复

public static void main(String[] args) {
int a = 527461410;
int a1 = (a & 0xff);
int a2 = ((a >> 8) & 0x00ff);
int a3 = ((a >> 16) & 0x00ff);
int a4 = ((a >> 24) & 0x00ff);
System.out.println(byteToHex(a1) + byteToHex(a2) +byteToHex(a3) +byteToHex(a4));
}

/**
* byte转换为十六进制字符串
*
* @param b
* byte
* @return 转换后十六进制字符串
*/
public static String byteToHex(int b) {
char b01 = getChar((b & 0xf0) >> 4);
char b02 = getChar(b & 0x0f);
return String.valueOf(b01) + String.valueOf(b02);
}

/**
* 取得16进制字符串
*
* @param b
* 16进制的数字表示
* @return 16进制的char
* @throws IllegalArgumentException
* 如果非16进制的数字则抛出该异常
*/
public static char getChar(int b) {
if (b >= 0 && b <= 9) {
return (char) ('0' + b);
}

if (b >= 10 && b <= 15) {
return (char) ('A' - 10 + b);
}

throw new IllegalArgumentException("error byte:" + b);
}


注意:0开头的数字为8进制,请注意..
qingralf 2012-06-12
  • 打赏
  • 举报
回复

BigInteger target = new BigInteger("2828718396");
System.out.println(target.toString(16));
System.out.println(Long.toHexString(2828718396l));


Number(2828718396).toString(16)

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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