2017-04-01 30 views
0

我有以下的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}&note={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. 将有永远只能是0,1,或2在base64编码字符串
  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; 

}