我不知道如何实现从php到java的这几行......
$varInHex = "\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x12\x36\x22\x31\xCA\x22\x11\x41\x62\x21\x22\x01\x55\x22\x71\x42\x10\x36";<br/><br/>
$result = md5($varInHex);
echo $result;
好吧,我试图转换它,但我得到了不同的结果!
byte[] seq20 = new byte[]{(byte)0x22,(byte)...etc...};
String str = seq20.toString();
String result = md5(str);
System.out.println(result);
public static String md5(String source) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(source.getBytes("UTF-8"));
return getString(bytes);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private static String getString(byte[] bytes) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
byte b = bytes[i];
String hex = Integer.toHexString((int) 0x00FF & b);
if (hex.length() == 1) {
sb.append("0");
}
sb.append(hex);
}
return sb.toString();
}
结果java与php中的结果不同..
你可以帮帮我吗? 提前谢谢你:)答案 0 :(得分:5)
你不能直接使用seq20而不转换它所以字符串吗? 我会这样做:
md.update( seq20 );
byte[] md5sum = md.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
while ( output.length() < 32 ) {
output = "0"+output;
}
答案 1 :(得分:5)
其他两个答案都没有肯定是错误的,但从优雅的角度来看,请考虑以下内容
String MD5(String... strings) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
for(final String s : strings) {
md.update(s.getBytes());
}
} catch (NoSuchAlgorithmException ex) {
throw new RuntimeException("MD5 Cryptography Not Supported");
}
final BigInteger bigInt = new BigInteger(1, md.digest());
return String.format("%032x", bigInt);
}
编辑 String...
varargs的使用完全是可选的,但它使函数更容易,因为它避免了调用函数中字符串连接的开销。
答案 2 :(得分:3)
接受的解决方案:
md.update( seq20 );
byte[] md5sum = md.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
if ( output.length() == 31 ) {
output = "0"+output;
}
包含一个将失败1/256次的实现,因为md5sum的输出可以有多个前导零。将引发此错误的示例md5输入是:“15446:68106”(不带引号)。
如果你需要一个与php实现相匹配的md5,我建议使用apache commons DigestUtils.md5Hex。
答案 3 :(得分:2)
看看:http://www.sergiy.ca/how-to-make-java-md5-and-sha-1-hashes-compatible-with-php-or-mysql/
此链接发布在此处:Java md5, the PHP way
答案 4 :(得分:0)
我的猜测是PHP正在将上面的内容评估为字符串,而非十六进制。而Java正在按照您的预期进行。