提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、PHP sha1方法
sha1() 函数计算字符串的 SHA-1 散列。
sha1() 函数使用美国 Secure Hash 算法 1。
如果成功,则返回所计算的 SHA-1 散列,如果失败,则返回 false。
参数 | 描述 |
---|---|
string | 必需。规定要计算的字符串。 |
raw | 可选。规定十六进制或二进制输出格式:
|
二、当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;
}
}
四、说明
没有做测试,没有做测试,没有做测试。