我想模拟这个JAVA代码:
String auth = "ec65450a-5:5217e";
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes());
String authHeader = "Basic " + new String(encodedAuth);
像这样对PHP:
$string = 'ec65450a-5:5217e';
$bytes = array();
$bytes = unpack('C*', $string);
$authHeader = 'Basic ' . base64_encode(implode('', $bytes));
但是PHP代码会生成另一个值。
答案 0 :(得分:2)
PHP已经将$string
视为字节字符串,因此您无需解压缩/分解它。
如果您这样做:
$string = 'ec65450a-5:5217e';
$bytes = unpack('C*', $string);
echo implode('', $bytes);
您得到了:
1019954535253489745535853504955101
这是每个字符的以10为底的整数ASCII值的混合列表,几乎可以肯定不是您想要的。只需直接编码字符串即可:
echo base64_encode($string);
结果:
ZWM2NTQ1MGEtNTo1MjE3ZQ==
此外,既然您已经将密码张贴在这里,那么您将想要更改密码。 :)
答案 1 :(得分:1)
检查编码器(Java和PHP)使用的字符集。
用于getBytes()
类的String
方法的JavaDoc。
使用平台的默认字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中。
未指定在默认字符集中无法编码此字符串时此方法的行为。
当需要对编码过程进行更多控制时,应使用java.nio.charset.CharsetEncoder类。
返回:结果字节数组
因为:JDK1.1
如果要使用特定的字符集,可以将其传递给方法:
"test".getBytes(StandardCharsets.UTF_8);
示例 这段代码产生两个不同的值:
String s = "ec65450a-5:5217e";
System.out.println(Base64.getEncoder().encodeToString(s.getBytes()));
System.out.println(Base64.getEncoder().encodeToString(s.getBytes(StandardCharsets.UTF_8)));
System.out.println(Base64.getEncoder().encodeToString(s.getBytes(StandardCharsets.UTF_16)));
输出
ZWM2NTQ1MGEtNTo1MjE3ZQ ==
ZWM2NTQ1MGEtNTo1MjE3ZQ ==
/ v8AZQBjADYANQA0ADUAMABhAC0ANQA6ADUAMgAxADcAZQ ==
前两个相同,因为getBytes()
使用平台的默认字符集,而恰好是UTF-8