已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 讨论/求助

标题: 两个方法能帮转成php吗

作者: @Ta

时间: 2020-12-03

点击: 5632


public byte[] a(String str, int i, String str2) {
    StringBuffer stringBuffer = new StringBuffer();
    if (str != null) {
        stringBuffer.append(str);
    }
    stringBuffer.append(i);
    stringBuffer.append(str2);
    stringBuffer.append("mMcShCsTr");
    Log.d("TAG111", "_mmessage_checksum: " + c(stringBuffer.toString().substring(1, 9).getBytes()));
    return c(stringBuffer.toString().substring(1, 9).getBytes()).getBytes();
}
public static final String c(byte[] bArr) {
    char[] cArr = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    try {
        MessageDigest instance = MessageDigest.getInstance("MD5");
        instance.update(bArr);
        byte[] digest = instance.digest();
        int length = digest.length;
        char[] cArr2 = new char[(length * 2)];
        int i = 0;
        int i2 = 0;
        while (i < length) {
            byte b = digest[i];
            int i3 = i2 + 1;
            cArr2[i2] = cArr[(b >>> 4) & 15];
            cArr2[i3] = cArr[b & 15];
            i++;
            i2 = i3 + 1;
        }
        return new String(cArr2);
    } catch (Exception e) {
        return null;
    }
}





[隐藏样式|查看源码]


『回复列表(10|隐藏机器人聊天)』

1.  太简单了吗 
(/@Ta/2020-12-03 22:05//)

2. 你这是要阿贾克斯转拍黄片?@大尨
(/@Ta/2020-12-03 22:23//)

3.
用户被禁言,发言自动屏蔽。
(/@Ta/2020-12-03 22:26//
被禁言
)

4. @无期徒刑,原来是咖啡☕啊
(/@Ta/2020-12-03 22:27//)

5. @TabKey9,也许有人同时会的呢。。
(/@Ta/2020-12-03 23:27//)

6.

@大尨

<?php

var_dump(a("a1", 2, "34"));

function a($str, $i, $str2) {
    $stringBuffer = "";
    if ($str != null) {
        $stringBuffer .= $str;
    }
    $stringBuffer .= $i;
    $stringBuffer .= $str2;
    $stringBuffer .= "mMcShCsTr";
    return md5(substr($stringBuffer, 1, 8));
}

输出:

string(32) "d300340816305da9f1020d38f9f6db74"

为什么c函数不见了?因为调试后发现c函数实际上就是PHP中的md5(),以下这段代码就是在做bin2hex()

        int length = digest.length;
        char[] cArr2 = new char[(length * 2)];
        int i = 0;
        int i2 = 0;
        while (i < length) {
            byte b = digest[i];
            int i3 = i2 + 1;
            cArr2[i2] = cArr[(b >>> 4) & 15];
            cArr2[i3] = cArr[b & 15];
            i++;
            i2 = i3 + 1;
        }

看下面这个调试输出就明白了:

import java.security.MessageDigest;

class Untitled {
	public static void main(String[] args) {
		System.out.println(new String(a("a1", 2, "34"))); // 【调试输出4】
	}
	public static byte[] a(String str, int i, String str2) {
		StringBuffer stringBuffer = new StringBuffer();
		if (str != null) {
			stringBuffer.append(str);
		}
		stringBuffer.append(i);
		stringBuffer.append(str2);
		stringBuffer.append("mMcShCsTr");
		return c(stringBuffer.toString().substring(1, 9).getBytes()).getBytes();
	}
	public static String c(byte[] bArr) {
		System.out.println(new String(bArr)); // 【调试输出1】
		char[] cArr = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
		try {
			MessageDigest instance = MessageDigest.getInstance("MD5");
			instance.update(bArr);
			byte[] digest = instance.digest();
			int length = digest.length;
			System.out.println(length); // 【调试输出2】
			System.out.println(byteToHex(digest)); // 【调试输出3】
			char[] cArr2 = new char[(length * 2)];
			int i = 0;
			int i2 = 0;
			while (i < length) {
				byte b = digest[i];
				int i3 = i2 + 1;
				cArr2[i2] = cArr[(b >>> 4) & 15];
				cArr2[i3] = cArr[b & 15];
				i++;
				i2 = i3 + 1;
			}
			return new String(cArr2);
		} catch (Exception e) {
			return null;
		}
	}
	public static String byteToHex(byte[] bytes){
        String strHex = "";
        StringBuilder sb = new StringBuilder("");
        for (int n = 0; n < bytes.length; n++) {
            strHex = Integer.toHexString(bytes[n] & 0xFF);
            sb.append((strHex.length() == 1) ? "0" + strHex : strHex);
        }
        return sb.toString().trim();
    }
}

输出是这样:

1234mMcS
16
d300340816305da9f1020d38f9f6db74
d300340816305da9f1020d38f9f6db74

说明byteToHex(digest)就是最终结果,而digest是md5值的二进制表示,按PHP写法就是$digest = md5($bArr, true),所以后面那段代码就相当于$cArr2 = bin2hex($digest)

(/@Ta/2020-12-04 00:56//)

7.

其实再精简一下可以写成:

<?php

var_dump(a("a1", 2, "34"));

function a($str, $i, $str2) {
    return md5(substr("{$str}{$i}{$str2}mMcShCsTr", 1, 8));
}

输出:

string(32) "d300340816305da9f1020d38f9f6db74"

看到这里,你该相信PHP是世界上最好的语言了吧

(/@Ta/2020-12-04 00:47//)

8. 感谢大佬回复,早上起来试试。@老虎会游泳
(/@Ta/2020-12-04 01:06//)

9.
我就说我咋看不懂,原来第二个方法是计算md5的 https://cway.top
(/@Ta/2020-12-04 08:20//)

10.

@hik,这三行是调用Java版的md5计算函数。

MessageDigest instance = MessageDigest.getInstance("MD5");
instance.update(bArr);
byte[] digest = instance.digest();

后续代码是在做bin2hex,把字节转换成十六进制表示:

        char[] cArr2 = new char[(length * 2)];
        int i = 0;
        int i2 = 0;
        while (i < length) {
            byte b = digest[i];
            int i3 = i2 + 1;
            cArr2[i2] = cArr[(b >>> 4) & 15];
            cArr2[i3] = cArr[b & 15];
            i++;
            i2 = i3 + 1;
        }

所以真正计算md5的函数并不在这里。

(/@Ta/2020-12-04 20:24//)

回复需要登录

9月2日 02:44 星期二

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1