繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM