簡體   English   中英

Java等價的PHP代碼返回不同的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。

您可能想先將這些數字轉換為字符

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

UPD

您可能還想使用 function pack將不同的數據類型轉換為字符串:

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

請注意,還有一個base64url編碼,它不是來自 PHP 的base64_encode()

例如,當您使用 PHP base64_encode()進行 JWT 編碼/解碼時,您會遇到麻煩。

所以對於你的情況試試

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