使用 PHP 解析 C# UrlTokenEncode 字符串

Parsing C# UrlTokenEncode string with PHP

我有以下使用 UrlTokenEncode 将图像转换为 base64 编码字符串的 c# 代码:

        byte[] imageArray = System.IO.File.ReadAllBytes(note_path);
        string base64ImageRepresentation = HttpServerUtility.UrlTokenEncode(imageArray);

        byte[] data = Encoding.UTF8.GetBytes($"id={id}&apikey={apikey}&friend_ids={friend_ids}&ttl={ttl}&note={base64ImageRepresentation}");

        Console.Write(sendRequest("upload-note", data));
        Console.ReadLine();

我将其发送到我的 lamp 服务器以通过 php 进行解析。显然这不起作用,因为 UrlTokenEncode 如何使用 - 表示 +_ 表示 /,以及填充等号的整数值。我有以下代码来克服这个问题:

                $request->note = str_replace('-', '+', str_replace('_', '/', $request->note));
                $lastCharacter = substr($request->note, -1);
                if($lastCharacter == 1 || $lastCharacter == 2){
                    $request->note = substr($request->note, 0, -$lastCharacter);
                    if($lastCharacter == 1){
                        $request->note = $request->note . '=';
                    } else {
                        $request->note = $request->note . '==';
                    }
                }

我对这个过程的关注来自尾随的等号。我读到只有 1 或 2 个等号用于填充,但是否存在没有填充的情况?如果可能的话,那么字符串的最后一个字符可能是任何随机整数值,对吗?如果这是真的,那么我当前在 php 中的解码过程将不起作用,因为它假定最后一个字符将始终为 1 或 2,并且该字符将代表所需的等号数...

如果我的过程不起作用,是否有更好的方法来解码带有 PHP 的 c# UrlTokenEncode 字符串?

回答我上面的问题:

  1. 在 base64 编码字符串的末尾只会有 0、1 或 2 个等号用于填充
  2. 如果没有填充则 0 附加到 base64 字符串

我创建了以下函数来将通过 c# 的 UrlTokenEncode 方法创建的 base64 字符串转换回常规 base64 字符串,以及从常规 base64 字符串转换为 UrlTokenDecode 期望的格式。

function convertToUrlTokenFormat($val){

    $padding = substr_count($val, '=');
    $val = str_replace('=', '', $val);
    $val .= $padding;
    $val = str_replace('+', '-', str_replace('/', '_', $val));

    return $val;

}

function convertFromUrlTokenFormat($val){

    $val = str_replace('-', '+', str_replace('_', '/', $val));
    $lastCharacter = substr($val, -1);
    $val = substr($val, 0, -1);
    switch($lastCharacter){
        case 1:
            $val = $val . "=";
            break;
        case 2:
            $val = $val . "==";
            break;
    }

    return $val;

}