[英]Base64 of byte array in Java and it's equivalent in 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代码会产生另一个值。
PHP已经将$string
视为字节字符串,因此您无需解压缩/分解它。
如果您这样做:
$string = 'ec65450a-5:5217e';
$bytes = unpack('C*', $string);
echo implode('', $bytes);
你得到这个:
1019954535253489745535853504955101
这是每个字符的基数为10的整数ASCII值的混合列表,几乎可以肯定不是您想要的。 只需直接编码字符串即可:
echo base64_encode($string);
结果:
ZWM2NTQ1MGEtNTo1MjE3ZQ==
此外,既然您已经在此处发布了密码,则需要更改它。 :)
检查编码器(Java和PHP)使用的字符集。
String
类的: getBytes()
方法的JavaDoc。
使用平台的默认字符集将此String编码为字节序列,并将结果存储到新的字节数组中。
未指定无法在默认字符集中编码此字符串时此方法的行为。
当需要对编码过程进行更多控制时,应使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.