Java 相当于 PHP 代码 return 不同的 base 64 编码结果
Java equivalent of PHP code return different base 64 encoding result
Java代码
completeStrBytes = new byte[2];
completeStrBytes[0] = (byte)(signatureLength>>>8); //signatureLength = 128
completeStrBytes[1] = (byte)signatureLength;
System.out.println(Base64.getEncoder().encodeToString(completeStrBytes));
输出:AIA=
PHP代码
$firstPart = $signatureLength >> 8;
$secondPart = $signatureLength;
var_dump(base64_encode($firstPart . $secondPart));
输出:字符串(8)“MDEyOA==”
我理解 PHP 字符串已被视为字节串。
我可以知道如何在 PHP 中获得 java 等效代码吗? PHP 代码有什么问题?
提前致谢。
如果是 Java 的情况,您正在为 2 字节数组 { 0x00, 0x80 }
计算 base64。在 php 的情况下,您正在为 4 个字符的字符串 "0128"
计算 base64(将两个数字作为字符串连接时得到)。
您可能首先要convert those numbers to chars:
var_dump(base64_encode(chr($firstPart) . chr($secondPart))); // string(4) "AIA="
UPD
您可能还想使用函数 pack 将不同的数据类型转换为字符串:
<?php
$signatureLength = 128;
var_dump(base64_encode(pack('n', $signatureLength))); // string(4) "AIA="
请注意还有一个 base64url
编码,它不是 PHP 中的 base64_encode()
。
当你使用 PHP base64_encode()
例如 JWT encoding/decoding,你会遇到麻烦。
所以对于你的情况试试
var_dump(base64url_encode($firstPart . $secondPart));
function base64url_encode($data)
{
$b64 = base64_encode($data);
if ($b64 === false) {
return false;
}
$url = strtr($b64, '+/', '-_');
return rtrim($url, '=');
}
function base64url_decode($data, $strict = false)
{
$b64 = strtr($data, '-_', '+/');
return base64_decode($b64, $strict);
}
Java代码
completeStrBytes = new byte[2];
completeStrBytes[0] = (byte)(signatureLength>>>8); //signatureLength = 128
completeStrBytes[1] = (byte)signatureLength;
System.out.println(Base64.getEncoder().encodeToString(completeStrBytes));
输出:AIA=
PHP代码
$firstPart = $signatureLength >> 8;
$secondPart = $signatureLength;
var_dump(base64_encode($firstPart . $secondPart));
输出:字符串(8)“MDEyOA==”
我理解 PHP 字符串已被视为字节串。
我可以知道如何在 PHP 中获得 java 等效代码吗? PHP 代码有什么问题?
提前致谢。
如果是 Java 的情况,您正在为 2 字节数组 { 0x00, 0x80 }
计算 base64。在 php 的情况下,您正在为 4 个字符的字符串 "0128"
计算 base64(将两个数字作为字符串连接时得到)。
您可能首先要convert those numbers to chars:
var_dump(base64_encode(chr($firstPart) . chr($secondPart))); // string(4) "AIA="
UPD
您可能还想使用函数 pack 将不同的数据类型转换为字符串:
<?php
$signatureLength = 128;
var_dump(base64_encode(pack('n', $signatureLength))); // string(4) "AIA="
请注意还有一个 base64url
编码,它不是 PHP 中的 base64_encode()
。
当你使用 PHP base64_encode()
例如 JWT encoding/decoding,你会遇到麻烦。
所以对于你的情况试试
var_dump(base64url_encode($firstPart . $secondPart));
function base64url_encode($data)
{
$b64 = base64_encode($data);
if ($b64 === false) {
return false;
}
$url = strtr($b64, '+/', '-_');
return rtrim($url, '=');
}
function base64url_decode($data, $strict = false)
{
$b64 = strtr($data, '-_', '+/');
return base64_decode($b64, $strict);
}