简体   繁体   English

Java等价的PHP代码返回不同的base 64编码结果

[英]Java equivalent of PHP code return different base 64 encoding result

Java Code Java代码

completeStrBytes = new byte[2];
completeStrBytes[0] = (byte)(signatureLength>>>8); //signatureLength = 128
completeStrBytes[1] = (byte)signatureLength;
System.out.println(Base64.getEncoder().encodeToString(completeStrBytes));

output: AIA=输出:AIA=

PHP Code PHP代码

$firstPart = $signatureLength >> 8;
$secondPart = $signatureLength;
var_dump(base64_encode($firstPart . $secondPart));

output: string(8) "MDEyOA=="输出:字符串(8)“MDEyOA==”

I understand PHP string already treat as byte string.我知道 PHP 字符串已经被视为字节字符串。

May I know how to get java equivalent code in PHP?我可以知道如何在 PHP 中获取 Java 等效代码吗? what's wrong in the PHP code? PHP 代码有什么问题?

Thanks in advance.提前致谢。

If the case of Java you're calculating base64 for 2-byte array { 0x00, 0x80 } .如果是 Java,您正在为 2 字节数组{ 0x00, 0x80 }计算 base64。 In case of php you're calculation base64 for a 4-character string "0128" (which you got when concatenated two numbers as strings).在 php 的情况下,您正在计算 4 个字符的字符串"0128" (将两个数字连接为字符串时得到的)的 base64。

You probably want to convert those numbers to chars first:您可能想先将这些数字转换为字符

  var_dump(base64_encode(chr($firstPart) . chr($secondPart))); // string(4) "AIA="

UPD UPD

You also may want to use function pack to convert different data types into a string:您可能还想使用 function pack将不同的数据类型转换为字符串:

<?php
  $signatureLength = 128;
  var_dump(base64_encode(pack('n', $signatureLength))); // string(4) "AIA="

Note that there is also a base64url encoding, which is NOT the base64_encode() from PHP.请注意,还有一个base64url编码,它不是来自 PHP 的base64_encode()

When you use PHP base64_encode() for example for JWT encoding/decoding, you will get into trouble.例如,当您使用 PHP base64_encode()进行 JWT 编码/解码时,您会遇到麻烦。

So for your case try所以对于你的情况试试

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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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