由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。

但,二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:

00000000 00000000 00000000 01100100

面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++,以及java中 没有提供在代码直接写二进制数的方法。

八进制数的表达方法

如何表达一个八进制数呢?如果这个数是 876,我们可以断定它不是八进制数,因为八进制数中不可能出7以上的阿拉伯数字。但如果这个数是123、是567,或12345670,那么它是八进制数还是10进制数,都有可能。所以规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数的表达方法。现在,对于同样一个数,比如是100,我们在代码中可以用平常的10进制表达,例如在变量初始化时:

int a = 100;

我们也可以这样写:

int a = 0144; //0144是八进制的100;

一个10进制数如何转成8进制,我们后面会学到。千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。

十六进制数的表达方法

如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数:9876,就看不出它是16进制或10进制。16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不区分大小写。(注意:0x中的0是数字0,而不是字母O)

以下是一些用法示例:

int a = 0x100F;

int b = 0x70 + a;

 

至此,我们学完了所有进制:10进制,8进制,16进制数的表达方式。最后一点很重要,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用达无符号的正整数,如果你在代码中里:-078,或者写:-0xF2,编译器并不把它当成一个负数。

使用十六进制进行消息摘要的例子

public static void main(String[] args) {

try {

MessageDigest md=MessageDigest.getInstance("MD5");

String password="CraneTower";

String name="0112345";

byte nam[]=name.getBytes("utf-8");

byte psd[]=password.getBytes("utf-8");

md.update(psd);

md.update(nam);

byte encryption[]=md.digest();

StringBuffer sb=new StringBuffer(encryption.length*2);

for(int i=0;i<encryption.length;i++){

sb.append(Character.forDigit(encryption[i]&0xf0>>4, 16));

sb.append(Character.forDigit(encryption[i]&0x1f>>4,16));

}

} catch (Exception e) {

e.printStackTrace();

}

Sb输出结果:40f1608051804000407131e020002000

详解:

消息摘要使用单项函数MD算法,本来只需给密码消息摘要,为了增强密码破解的难度,更新时加入了用户名使其摘要信息更加没有规律。消息摘要后的字节数组encryption为16,为了使结果显示为32字节的字符串。这儿把二进制的字节转化为16进制的字节,每四位就是一个16进制数,所以16*8/4=32个字节。

Charactor中的static char forDigit(int digit, int radix) 方法。

0xf0是十进制的240 二进制表示形式 00000000 00000000 00000000 11110000

按位与的特点是对应位都是1时结果是1,否则为0,所以encryption[i]&0xf0运算结果是00000000 00000000 00000000 xxxx0000这种形式,向右移四位后变成00000000 00000000 00000000 0000xxxx这种形式。移位运算可以参考《JAVA开发实战经典》p39页,这样计算后使结果encryption[i]&0xf0>>4低位不为0的位数最多不超过4,符合十六进制的转换要求

注意:这儿的16进制数选取不当容易使相应位为0,按位与的16进制数不能过小

例子还可以实用bouncycastle包中Hex类转换

import java.security.MessageDigest;

import org.bouncycastle.util.encoders.Hex;

public class MD5Test {

public static void main(String[] args) throws Exception {

MessageDigest md=MessageDigest.getInstance("MD5");

String password="CraneTower";

String name="0112345";

byte nam[]=name.getBytes("utf-8");

byte psd[]=password.getBytes("utf-8");

md.update(psd);

md.update(nam);

byte encryption[]=md.digest();

String hexmd5 = new String (Hex.encode(encryption));

System.out.println(hexmd5);

}

}

结果740f96a8a558f4509477e37e324072f0

MD5中使用16进制消息摘要相关推荐

  1. MD5中使用16进制

    MD5中使用16进制消息摘要 分类: java_secruity2012-12-28 13:11 719人阅读 

  2. 内存地址中的16进制最小单位是1bit,1Byte?

    在研究 union的时候遇到一个题目,是关于大小端的问题,从而牵扯出了探索内存地址的问题 #include <stdio.h>static union {int i;char a[2]; ...

  3. 用Matlab把 .txt文件中的16进制数据转换成2进制数据

    问题描述 使用Matlab将.txt文本文件里面存放的16进制数据转换成2进制数据,放入一个新的.txt文件中.直接附代码解释,第一次发文章,仅为了练习使用和记录. clear; clc; fid = ...

  4. Java十六进制码的字符_【重点】java中 转16进制字符串 hex

    方法3: BigInteger bigInteger = new BigInteger(1,bytes); String string = bigInteger.toString(16);//转换成1 ...

  5. Lua中的16进制,2进制,10进制转换

    Lua中的数据转换 10进制number转二进制字符串(0~255) function _byte2bin(n)local t = {}for i=7,0,-1 dot[#t+1] = math.fl ...

  6. hexde php_怎样在PHP中把16进制HEX数据转换为2进制数据呢?

    展开全部 十六进制62616964757a686964616fe78988e69d8331333337623531转为二进制有两种理解方法,第一是十六进制字符串转二进制字符串,第二是十六进制数转二进制 ...

  7. EXCEL中实现16进制MAC的下拉

    一般我们都只会EXCEL进行10进制的下拉自动增长,但是如果是16进制数,如何进行下拉呢? EXCEL截图: 计算公式为: =REPT(0,$C$3-LEN($B$3))&$B$3&R ...

  8. shell 中转换16进制10进制

    2012年10月10日 17:28:55 帝都码农 阅读数 12150 标签: shell 更多 个人分类: shell 一.16进制转换成10进制 printf %d 0xF 15 或者 echo ...

  9. 计算机中的16进制4f,计算机里的十六进制应该怎样理解?

    2006-02-03 计算机基础,有十进制,二进制,十六进制,我想知道他们之间怎么相互换算 二进制数转换为十进制数 二进制数第0位的权值是2的0次方,第1位的权值是2的1次方-- 所以,设有一个二进制 ...

最新文章

  1. 【ACM】杭电OJ 2024
  2. 实战:人脸识别实战项目(源码共享)
  3. java安全地生成128,256,512bit随机数
  4. python 内部函数,以及lambda,filter,map等内置函数
  5. AMD正式公布第七代桌面级APU AM4新接口
  6. 软件开发报价的计算方法[转载]
  7. sql between的用法的意思_SQL 宝典——SQL 语法速成手册
  8. python基础编程语法-Python基础语法介绍:面向对象编程(上)
  9. 病毒传播数学建模matlab分析,数学建模MATLAB之分析法(一)
  10. 图像局部特征(十三)--FREAK特征
  11. 老板最讨厌的10种烂个性
  12. 用Calibre去除Kindle电子书的DRM版权限制
  13. Javascript常用函数、方法速查手册
  14. 台式计算机如何上无线网络,台式机如何无线上网
  15. Word 悬挂缩进文本如何对齐
  16. ssdt函数索引号_shadow ssdt 服务表函数索引
  17. not within a switch statement_【实用教程】Switch无法登录关联任天堂账号怎么办
  18. 25.有5个人做在一起, 问第五个人多少岁? 他说比第四个人大2岁. 问第四个人岁数, 他说比第是三个人大2岁. 问第三个人, 又说比第二人大两岁. 问第二个人, 说比第一个人大两岁. 最后问第一个人
  19. 学Python真的好找工作吗?工作多年的程序员为你解答
  20. Android SDK (介绍)

热门文章

  1. PHP基础之一揽子方案
  2. HTML3天快速入门教程(详细整理附案例)
  3. 前端常用的开发工具介绍及其下载
  4. 我的江湖也是你的江湖
  5. KCP 协议与源码分析(一)
  6. 普洛菲斯触摸屏Proface 口令密码查看 gp3/gp4屏程序都可以解 GP-Pro EX项目密码查看,访问密码查看,上传密码查看,超级密码查看
  7. python tkinter库实现气泡屏保和锁屏
  8. 修改XP开机画面最简单办法
  9. 某项目608版本投产前验收问题报告与后续研发流程改进方案
  10. mac终端远程登陆服务器