关于MD5加密中转换byte为十六进制的问题
来源:互联网 发布:网络推销是什么工作 编辑:程序博客网 时间:2024/06/06 07:45
关于MD5加密中转换byte为十六进制的问题
问题陈述
先看看MD5加密的代码
StringBuilder builder = new StringBuilder();MessageDigest md = MessageDigest.getInstance("MD5");md.update(myContentString.getBytes());byte[] bytes = md.digest();for(byte b : bytes) builder.append(Integer.toString((b & 0xff) + 0x100).subString(1));String result = builder.toString();
为啥倒数第二句要这样写呢?
问题解答
在Java中,byte转化为int时是按照带符号扩展进行转换的。举个例子,如有一个byte为1111_1111,那么当它转化为int时,剩余的24位与byte的最高位也就是符号位相同,那么此时int就会成为32个1组成的整数。显然这并不是我们想要的,因为我们需要的是0xff而非0xffffffff。
那为啥&一下就可以了呢?
为了处理被扩展的24位。首先在Java中,0xff、123这样的非小数的字面量默认为int类型,byte与这样的字面量相运算,根据向上转换原则,结果自动转化为int类型。第二,&的特性就是对应位相同同为1,不同为0,这样就能达到将byte转化为int时的前24个填充位置为0的效果,也就是达到了筛出最后八位的效果。这样在将其转化为十六进制字符串时就无需考虑前24位的问题。
加上0x100的原因?
为了前导零。我们需要将byte转化为2位的十六进制数,但是如果byte的高4位为0那么输出的话就仅仅有一位。如byte为0000_1111时,不加0x100那么上面的代码就会将byte转化为f,而非0f。当加上0x100时,还以此为例子,那么结果就是0x10f,在通过取子串的方式,从index = 1的地方开始取(index从零开始),这样就可以把0f取出来了。
其他解决方案有木有
可以利用字符串格式化操作,直接将倒数第二句写成
builder.append(String.format("%02x",b));
“%02x”表示把b格式化为2位的十六进制,不够补上前导零。
0 0
- 关于MD5加密中转换byte为十六进制的问题
- MD5加密之后之后转换为十六进制字符串的代码
- 关于MD5加密的问题
- java中转换为字符串的方法
- MD5加密与byte[]数组与十六进制字符串与字符串的互相转换
- Struts2中转换Date类型的问题
- Struts2中转换Date类型的问题
- java 中转换html 实体编码为汉字---unicode编码(\u)、十进制(&#)、十六进制(&#x)
- Java生成十六进制的MD5加密字符串
- Java中转换为Json对象的例子
- MySql中转换字段的null值为0
- 解决Struts2中转换Date类型的问题
- Struts2中转换Date类型的问题 Ljava.lang.String
- vc6.0向VS2010中转换问题的解决
- Struts2中转换Date类型的问题(IE)
- 关于MD5加密中byte数组转换成16进制字符串的研究
- js中转换字符串为JSON格式
- 关于MD5加密的问题,在C#中的使用
- 号角
- 提高 Ruby 程序员效率的 rc 文件
- 修改php.ini配置文件无效
- HDU 1116 Play on Words
- couldn’t be completed. (LaunchServicesError error 0.)
- 关于MD5加密中转换byte为十六进制的问题
- jquery(3)
- Android 实现沉浸式状态栏
- Android 事件分发机制详解(2)-ViewGroup
- 6.性能测试工具Locust介绍和安装
- nyist 468 Fibonacci数列(六)(Miller-Rabin算法 大数素性测试)
- 根据自己的需要写了一个温度计效果,WEB版的
- 好好做好自己的事情
- 数学悖论与三次数学危机