Я пытаюсь преобразовать это:
function _password_itoa64() {
return './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
}
function _password_base64_encode($input, $count) {
$output = '';
$i = 0;
$itoa64 = _password_itoa64();
do {
$value = ord($input[$i++]);
$output .= $itoa64[$value & 0x3f];
if ($i < $count) {
$value |= ord($input[$i]) << 8;
}
$output .= $itoa64[($value >> 6) & 0x3f];
if ($i++ >= $count) {
break;
}
if ($i < $count) {
$value |= ord($input[$i]) << 16;
}
$output .= $itoa64[($value >> 12) & 0x3f];
if ($i++ >= $count) {
break;
}
$output .= $itoa64[($value >> 18) & 0x3f];
} while ($i < $count);
return $output;
}
PHP-код в Java и в настоящее время имеет это:
private static String _password_itoa64(){
return "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
}
private String _password_base64_encode(byte[] hash, int count){
StringBuffer output = new StringBuffer();
String input = new String(hash);
String itoa64 = _password_itoa64();
int i = 0, value;
do {
value = input.charAt(i++);
output.append(itoa64.charAt(value & 0x3f));
if (i < count) {
value |= (int)(input.charAt(i) << (char)8);
}
output.append(itoa64.charAt((value >> 6) & 0x3f));
if (i++ >= count) {
break;
}
if (i < count) {
value |= (int)(input.charAt(i) << (char)16);
}
output.append(itoa64.charAt((value >> 12) & 0x3f));
if (i++ >= count) {
break;
}
output.append(itoa64.charAt((value >> 18) & 0x3f));
}
while (i < count);
return output.toString();
}
Когда получено то же самое, это произошло:
php - 6gL/BBSRbbJS7V.avvpcInZvukU4scZRsdWGwlPCG7R
Java - 6gL/BBSRbbJS7V.rvvpcInZvukU4scZRsdWGwlPCG7R
строка ввода - в шестнадцатеричном виде это 087b054de375e75979490898fb5ea3d45cee3a0c1a385a76782a4a7cbc3952d21d8b9523175d95d21c5eddb3efebb88733d8cb9de1217075429
Есть какие-нибудь подсказки относительно того, что вызвало случайного несоответствующего персонажа?
EDIT:
В поисках того, что пошло не так, в PHP value |= (int)(input.charAt(i) << (char)16);
эта строка устанавливает значение равным 9963593 с ord($input[$i])
равным 152, а в Java оно устанавливает 47974473, когда input.charAt(i)
равно 732
Полагаю, это означает, что я выбрал правильный способ преобразования ord($input[$i])
в Java