IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> JAVA实现PHP方法sha1(““true) -> 正文阅读

[PHP知识库]JAVA实现PHP方法sha1(““true)

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


一、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;
    }
}

四、说明

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

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 18:34:35  更:2021-09-11 18:35:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 9:25:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码