Java中十六进制转换 Integer.toHexString()
来源:互联网 发布:mac草莓红和番茄红 编辑:程序博客网 时间:2024/05/15 08:39
【源】http://jiangzhengjun.iteye.com/blog/506041
【源】http://blog.csdn.net/java_freshman01/article/details/7257218
为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用:Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).substring(6) byteVar & 0x000000FF的作用是,如果byteVar 是负数,则会清除前面24个零,正的byte整型不受影响。(...) | 0xFFFFFF00的作用是,如果byteVar 是正数,则置前24位为一,这样toHexString输出一个小于等于15的byte整型的十六进制时,倒数第二位为零且不会被丢弃,这样可以通过substring方法进行截取最后两位即可。 Java代码 收藏代码import junit.framework.TestCase; public class Hex extends TestCase { public void testPositiveIntToHex() { //如果正数小于15时,只输入一位,而不是按我们想像的两位标准十六进制输出显示的,后面解决这个问题 System.out.println(Integer.toHexString(2));//2 System.out.println(Integer.toHexString(15));//f System.out.println(Integer.toHexString(16));//10 System.out.println(Integer.valueOf("F", 16));//16 } /* * Integer.valueOf()实质上调用的是Integer.parseInt()来完成的,所以 * Integer.parseInt()与Integer.valueOf()功能是一样的,只是返回值不 * 一样而已 */ public void testNegativeIntToHex() { //负整数时,前面输入了多余的 FF ,没有去掉前面多余的 FF,按并双字节形式输出 System.out.println(Integer.toHexString(-2).toUpperCase());//FFFFFFFE //实质上0xFF会像转换成0x000000FF后再进行位运算 System.out.println(Integer.toHexString(-2 & 0xFF).toUpperCase());//FE System.out.println(Integer.toHexString(-2 & 0x000000FF).toUpperCase());//FE //注,FE输出时不会为-2,因为此时不会把FE看成负数,valueOf会把所有数字串看成正的 System.out.println(Integer.valueOf("FE", 16));//254 //如果要输出-2,只能按以下形式输出 System.out.println(Integer.valueOf("-2", 16));//-2 //所以要把 FE 看成负的话,只能在前面加上负号,但是这里输出还不是-2, //而是先计算Integer.valueOf("FE", 16),再在结果前加上负 System.out.println(Integer.valueOf("-FE", 16));//-254 /* 所以如果要输入某个负数,我们只能先求出该数的绝对值的原码十六进制,再在前面加上负号, * 例如求表示-128,则先对绝对值128求十六进制 80,再在前面加上负号 -80 */ System.out.println(Integer.valueOf("-80", 16));//-128 /* 为什么说valueOf把所有数字串看成正的呢?请看下面三行代码,因为最大正数为2147483647, * 如果再 在7fffffff基础上加上一个一,运行肯定会出错误(这与直接输出0x80000000不一样), * 那么就可以证明 */ System.out.println(Integer.valueOf("7fffffff", 16));//2147483647 //此句运行时会报错,因为最大正数为7fffffff,但如 -80000000 却又可以运行,因为没超出整数范围 //System.out.println(Integer.valueOf("80000000", 16));//不能运行,已注掉 System.out.println(Integer.valueOf("-80000000", 16));//-2147483648 /* 注,输出时不是负数,而是正,因为0xFE只有8位,而整数是32位,所以以int形式出现时前 * 面会自动补24个零,第一位是零,所以最后是正数 */ System.out.println(0xFE);//254 System.out.println(-0xFE);//-254 //但0x80000000已满,无需补,第一位为一,所以最后为负数 System.out.println(0x80000000);//-2147483648 } public void testNegativeIntToBin() { System.out.println(Integer.toBinaryString(-2));//11111111111111111111111111111110 //实质上0xFF会像转换成0x000000FF后再进行位运算 System.out.println(Integer.toBinaryString(-2 & 0xFF));//11111110 System.out.println(Integer.toBinaryString(-2 & 0x000000FF));//11111110 //与上面十六进制是一样的 System.out.println(Integer.valueOf("1111111111111111111111111111111", 2));//2147483647 //下面语句运行会出错,已注掉 //System.out.println(Integer.valueOf("10000000000000000000000000000000", 2)); System.out.println(Integer.valueOf("-10000000000000000000000000000000", 2));//-2147483648 System.out.println(Integer.valueOf("11111110", 2));//254 System.out.println(Integer.valueOf("-11111110", 2));//-254 /* 注,Java中没有直接使用二进制表示一个数(目前只支持八与十六进制直接表示法),下面其实是一个 * 八进制的数与十进制的数 */ System.out.println(010);//8 System.out.println(10);//10 } public void testByteToHex() { byte negativeByte = -2; byte positiveByte = 2; /* toHexString方法类型为int型,所以转Hex前参数会提升成整型后再进行转换,过程如下: * 10000010(原码)->11111110(补码)->11111111 11111111 11111111 11111110(提升) * ->FFFFFFFE(转Hex进制输出) */ System.out.println(Integer.toHexString(negativeByte).toUpperCase());// FFFFFFFE /* 第一步把-2转成整型: * 10000010(原码)->11111110(补码)->11111111 11111111 11111111 11111110(转整型) * 第二步把 0xFF 前补24个零: * 00000000 00000000 00000000 11111111 * 第三步:把第一二步结果进行与位运算: * 00000000 00000000 00000000 11111110 * 最后一步:转十六进制结果为 FE */ System.out.println(Integer.toHexString(negativeByte & 0xFF).toUpperCase());// FE //另一种转换,可以针对负数与正数的byte都可以以完整的单字节输出 System.out.println(Integer.toHexString((negativeByte & 0x000000ff) | 0xffffff00) .substring(6).toUpperCase());//FE System.out.println(Integer.toHexString((positiveByte & 0x000000ff) | 0xffffff00) .substring(6).toUpperCase());//02 } /** * 位运算与算术运行中的类型提升机制是一样的 */ public void testBiteMathematical() { System.out.println(0x8000000000000000L);//-9223372036854775808 System.out.println((int) 0x8000000000000000L);//0 System.out.println(0x8000000000000010L);//-9223372036854775792 System.out.println(0x80000000);//-2147483648 System.out.println(0x80000010);//-2147483632 //0x00000010提升成长整型,最后结果为长整型0x8000000000000010L System.out.println(0x00000010 | 0x8000000000000000L);//-9223372036854775792 //0x0010提升成整形,最后结果为整型0x80000010 System.out.println(0x0010 | 0x80000000);//-2147483632 } }
import java.security.MessageDigest;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * 安全相关的工具类,包括以下工具 * 1、加密和解密 * 2、签名和解签 * 3、Base64Encode和Base64Decode * 4、URL特殊字符替换 * 5、日期相关 */public class Security {public static final String KEY = "123456789abcdefgh";private final static Log logger = LogFactory.getLog(Security.class);/** * key的长度需要满足为8的倍数 * @param key * @return */private static byte[] getFinalKey(String key) {int len = key.length();String tmpKey = "";if(len > 8) {int num = len%8;if(num > 0) {tmpKey = key.substring(0, num);}}String finalKey = tmpKey + KEY;byte[] arrBTmp = finalKey.getBytes();//创建一个空的16位字节数组(默认值为0) byte[] arrB = new byte[16]; for (int i = 0; i < arrB.length; i++) { arrB[i] = arrBTmp[i]; } return arrB;}public static String encrypt(String input, String key) throws Exception {byte[] crypted = null;try {SecretKeySpec skey = new SecretKeySpec(getFinalKey(key), "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, skey);crypted = cipher.doFinal(input.getBytes());} catch (Exception e) {logger.error("Security.encrypt error:", e);throw e;}return new String(Base64.encodeBase64(crypted));}public static String decrypt(String input, String key) throws Exception {byte[] output = null;try {SecretKeySpec skey = new SecretKeySpec(getFinalKey(key), "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, skey);output = cipher.doFinal(Base64.decodeBase64(input.getBytes()));} catch (Exception e) {logger.error("Security.decrypt error:",e);throw e;}return new String(output);}/** * 使用"SHA-256"算法和"UTF8"字符集,获取源字符串的信息摘要 * @param orgStr 源字符串 * @return * @throws Exception */public static String sign(String orgStr) throws Exception {return sign(orgStr,"SHA-256","UTF8");}/** * 使用指定的算法和字符集,获取源字符串的信息摘要 * @param orgStr 源字符串 * @param algorithm 算法 * @param charserName 字符集 * @return * @throws Exception */public static String sign(String orgStr, String algorithm, String charserName) throws Exception {StringBuffer hashValue = new StringBuffer();MessageDigest m = MessageDigest.getInstance(algorithm);m.update(orgStr.getBytes(charserName));byte s[] = m.digest();for (int i = 0; i < s.length; i++) {//为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码hashValue.append(Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6)); }return hashValue.toString();}public static void main(String[] args) {try {String orgStr = "P123456789summery1433299248.28{a:b,a:c}ooNO@Hh#bXKOh3wMa!";String signStr = "88dd961ffc4ddbde1666e01e60033955afa394e0fae3d1ccf4cae20174dd1b7d"; //C人员给的System.out.println(sign(orgStr));System.out.println(signStr.equals(sign(orgStr)));} catch (Exception e) {e.printStackTrace();}}}
0 0
- 【转】Java中十六进制转换 Integer.toHexString()
- Java中十六进制转换 Integer.toHexString()
- Java中十六进制转换 Integer.toHexString()
- Java中十六进制转换 Integer.toHexString()
- Java中十六进制转换 Integer.toHexString()
- Java中十六进制转换 Integer.toHexString()
- Java中十六进制转换 Integer.toHexString()
- Java中十六进制转换 Integer.toHexString()
- Java中十六进制转换 Integer.toHexString()
- java.lang.Integer.toHexString()方法
- byte类型变量使用Integer.toHexString()显示其十六进制编码
- Integer.toHexString(int)得到byte类型的十六进制字符串形式
- java.lang.Integer.toHexString(b[n] & 0XFF)中0XFF使用的必要性
- 【转】java.lang.Integer.toHexString(b[n] & 0XFF)中0XFF使用的必要性
- java.lang.Integer.toHexString(b[n] & 0XFF)中0XFF使用
- java.lang.Integer.toHexString(b[n] & 0XFF)中0XFF使用
- java.lang.Integer.toHexString(b[n] & 0XFF)中0XFF使用的必要性
- java.lang.Integer.toHexString(b[n] & 0XFF)中0XFF使用的必要性
- java.lang.ClassNotFoundException: org.apache.jsp.login_jsp
- CheungSSH比Ansible更优秀的Linux SSH批量管理服务器 执行命令上传下载自动化运维工具
- 4.2-4
- Pow(x, n)
- 精实未必总能创造出更好的产品
- Java中十六进制转换 Integer.toHexString()
- RMAN跨平台(endian format不同)迁移数据库
- To show image on Android
- qt按键焦点切换
- C# List转DataSet
- test
- <<做个截图>>iOS版隐私政策
- SpringMvc 集成 shiro 实现权限角色管理-maven
- sharesdk的使用,有关分享和第三方登录