Java中字节数组的Base64,在PHP中等效

时间:2019-01-09 18:44:30

标签: java php

我想模拟这个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代码会生成另一个值。

2 个答案:

答案 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