【发布时间】:2013-09-22 23:50:28
【问题描述】:
编辑
我将$checksum = md5($someString+$bkey); 更改为$checksum = md5($someString.$bkey);
我需要在 Java 中执行以下操作:
$hexString = '90aa';#sample value
$bkey = pack('H*',$hexString);
$someString='qwe';#sample value
$checksum = md5($someString.$bkey);
echo $checksum;
我无法在 Java 中将 hexString 转换为 bkey 以获得与 php 脚本相同的结果。除了bkey 一切正常。
如果我删除 bkey 那么:
PHP:
$someString='qwe';#sample value
$checksum = md5($someString);
echo $checksum;
结果:76d80224611fc919a5d54f0ff9fba446
Java:
String someString = "qwe";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
String checksum = new BigInteger(1, messageDigest.digest(someString
.getBytes())).toString(16);
System.out.println(checksum);
结果:76d80224611fc919a5d54f0ff9fba446
如您所见,它有效
与bkey:
PHP:
$hexString = '90aa';#sample value
$bkey = pack('H*',$hexString);
$someString='qwe';#sample value
$checksum = md5($someString.$bkey);
echo $checksum;
结果:18f5f1a9bf898131945dd9e315759fe4
Java:
public static void main(String[] args) throws NoSuchAlgorithmException {
String hexString = "90aa";
String bkey = hexToString(hexString);
String someString = "qwe";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
String input = someString + bkey;
String checksum = new BigInteger(1, messageDigest.digest(input
.getBytes())).toString(16);
System.out.println(checksum);
}
public static String hexToString(String hex) {
StringBuilder output = new StringBuilder();
for (int i = 0; i < hex.length(); i += 2) {
String str = hex.substring(i, i + 2);
output.append((char) Integer.parseInt(str, 16));
}
return output.toString();
}
结果:44bb634dee436833dd65caa5043ffeb9
如您所见,结果不同。
如何将hex String 转换为String 以获得相同的结果?
【问题讨论】:
-
@Joni 它也给出了不同的结果,所以它不是重复的。
-
String.getBytes()的输出取决于默认字符集。您应该直接处理字节数组。 -
@nwellnhof 你是什么意思?如果作为 md5 的输入,我使用
byte[] result=ArrayUtils.addAll(someString.getBytes(), bkey);,其中bkey是字节数组,那么我也会得到错误的结果。为了计算bkey,我使用了 Joni 评论中的Convert a string representation of a hex dump to a byte array using Java? -
不,您首先将十六进制字符串转换为另一个字符串,然后再转换为字节数组。尝试将其直接转换为字节数组,如另一个问题中所述。