两个方法能帮转成php吗

@Ta 2020-12-03 5634点击

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|隐藏机器人聊天)
  • @Ta / 2020-12-03 / /
     太简单了吗 
  • @Ta / 2020-12-03 / /
    你这是要阿贾克斯转拍黄片?@大尨
  • @Ta / 2020-12-03 / /
    被禁言
    用户被禁言,发言自动屏蔽。
  • @Ta / 2020-12-03 / /
    @无期徒刑,原来是咖啡☕啊
  • @Ta / 2020-12-03 / /
    @TabKey9,也许有人同时会的呢。。
  • @Ta / 2020-12-04 / /

    @大尨

    <?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 / /

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

    <?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 / /
    感谢大佬回复,早上起来试试。@老虎会游泳
  • hik
    @Ta / 2020-12-04 / /
    我就说我咋看不懂,原来第二个方法是计算md5的 https://cway.top
  • @Ta / 2020-12-04 / /

    @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的函数并不在这里。

添加新回复
回复需要登录