使用 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}¬e={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 字符串?
回答我上面的问题:
- 在 base64 编码字符串的末尾只会有 0、1 或 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;
}
我有以下使用 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}¬e={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 字符串?
回答我上面的问题:
- 在 base64 编码字符串的末尾只会有 0、1 或 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;
}