2017-04-01 79 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; 

}