解析C#UrlTokenEncode串用PHP
问题描述:
我有以下的C#代码将图像转换成使用UrlTokenEncode base64编码字符串:解析C#UrlTokenEncode串用PHP
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();
我送这个给我的灯服务器可以通过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,并且该字符将表示所需等号的数量...
如果我的过程将无法正常工作,有没有更好的方法来解码ac#UrlTokenEncode字符串与PHP?
答
回答我上面的问题:
- 将有永远只能是0,1,或2在base64编码字符串
- 结束等于用于填充迹象,如果没有填充,然后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;
}