JAVA实现PHP方法sha1(““,true)

本文详细介绍了PHP的sha1()函数及其使用,当raw参数为true时,散列结果会转换为原始二进制格式。同时,通过一个JAVA示例展示了如何将40位十六进制的SHA1字符串转换回原始二进制字符串的过程,涉及到的步骤包括十六进制拆分、转换为十进制以及ASCII码对应。请注意,超出127的ASCII值在某些环境中可能显示为特殊字符。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、PHP sha1方法

sha1() 函数计算字符串的 SHA-1 散列。

sha1() 函数使用美国 Secure Hash 算法 1。

如果成功,则返回所计算的 SHA-1 散列,如果失败,则返回 false。

参数描述
string必需。规定要计算的字符串。
raw可选。规定十六进制或二进制输出格式:
  • TRUE - 原始 20 字符二进制格式
  • FALSE - 默认。40 字符十六进制数

    注释:该参数是 PHP 5.0 中添加的。

二、当raw为true

<?php
	$str = sha1("我们");
	echo($str);
	
	//结果为:0805949359741ce14fe90402b25e2e023f449748
?>
<?php
	$str_true = sha1("我们", TRUE);
	echo($str_true);
	//结果为:��Yt�O��^.?D�H
?>

当raw为true时,其实就是对十六进制串又做了一系列转换。
上述结果 str_true 其实就是对 str 得一系列转换。
如何转换:
上述结果 str 为 40 字符十六进制数 字符串

  • 将 40 位 16进制 字符串按照两两为一组,分割成 20 组 16进制 的字符串:08,05,94,93,59,74,1c,e1,4f,e9,04,02,b2,5e,2e,02,3f,44,97,48
  • 将每一组 16进制 的数值转换成为 10进制 数值:
    08,05,148,147,89,116…
  • 对照 ASCII 码表 进行翻译出最终的原始二进制字符串。
    (对与匹配到非打印控制字符显示为空,超过127显示为�)

在这里插入图片描述

三、JAVA转换

代码如下(示例):

import java.io.*;
class test  
{
	public static void main (String[] args) throws java.lang.Exception
	{ 
		String str = "0805949359741ce14fe90402b25e2e023f449748";
        String asciiStr = convertedBinaryString(str);
        System.out.println(asciiStr);
	}
	
	public static String convertedBinaryString(String str){
        
        String[] strAry = getHexadecimalArray(str);
        char[] charAry = new char[20];
        //char[] charAry = new char[strAry.lenght]; 这么写会报错 不知道为什么
        int i = 0;
        for (String tempStr : strAry) {
            String a16 = hexStringToBinary(tempStr);
            int charIndex = binaryToAlgorism(a16);
            //超过127 java显示了ascii得扩展表 这里处理一下
            if (charIndex > 127){
                charAry[i] = '�'; //这个其实和上面得那个字符一样,显示不同。可能是编码问题。
            }else{
                char b = (char)charIndex;
                charAry[i] = b;
            } 
            i++;
        } 
        return String.valueOf(charAry);
    } 
	
	 /**
     * 分割字符串为数组
     * 两两为一组
     * @param str 十六进制字符串
     * @return 十六进制数 字符串数组
     */
    public static String[] getHexadecimalArray(String str){
    	int arylength = str.length() / 2;
        String[] hexAry = new String[arylength]; 
        for (int i = 0; i < hexAry.length; i++) {
            hexAry[i] = str.substring(i * 2, i * 2 + 2); 
        }
        return hexAry;
    } 


    /**
     * 二进制字符串转十进制
     * 
     * @param binary
     *            二进制字符串
     * @return 十进制数值
     */
    public static int binaryToAlgorism(String binary) {
        int max = binary.length();
        int result = 0;
        for (int i = max; i > 0; i--) {
            char c = binary.charAt(i - 1);
            int algorism = c - '0';
            result += Math.pow(2, max - i) * algorism;
        }
        return result;
    }
 
    /**
     * 十六转二进制
     * 
     * @param hex
     *            十六进制字符串
     * @return 二进制字符串
     */
    public static String hexStringToBinary(String hex) {
        hex = hex.toUpperCase();
        String result = "";
        int max = hex.length();
        for (int i = 0; i < max; i++) {
            char c = hex.charAt(i);
            switch (c) {
            case '0':
                result += "0000";
                break;
            case '1':
                result += "0001";
                break;
            case '2':
                result += "0010";
                break;
            case '3':
                result += "0011";
                break;
            case '4':
                result += "0100";
                break;
            case '5':
                result += "0101";
                break;
            case '6':
                result += "0110";
                break;
            case '7':
                result += "0111";
                break;
            case '8':
                result += "1000";
                break;
            case '9':
                result += "1001";
                break;
            case 'A':
                result += "1010";
                break;
            case 'B':
                result += "1011";
                break;
            case 'C':
                result += "1100";
                break;
            case 'D':
                result += "1101";
                break;
            case 'E':
                result += "1110";
                break;
            case 'F':
                result += "1111";
                break;
            }
        }
        return result;
    }
}

四、说明

没有做测试,没有做测试,没有做测试。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值