Кодировать URL из C #, расшифровывать URL-адрес в PHP (добавляются дополнительные символы)

Я читал так много тем по этому вопросу до сих пор, я не могу понять, где может быть проблема. Я шифрую часть URL-адреса из приложения winform C #. Затем я хочу прочитать URL-адрес с помощью php и расшифровать URL-адрес (все используют base-64). У меня есть какой-то код, который нужно разглядеть:

Код для шифрования URL (C #):

public static string Base64Encode(string str) { byte[] encbuff = Encoding.UTF8.GetBytes(str); return System.Web.HttpServerUtility.UrlTokenEncode(encbuff); } 

Расшифруйте раздел URL-адреса:

 Base64Encode("CND0311J4S68CCU Ver. F.0BHPQOEM - f"); 

Возвращает:

 Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1 

Код для расшифровки URL (PHP):

 echo base64_decode("Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1"); 

Возвращает:

 CND0311J4S68CCU Ver. F.0BHPQOEM - f5 

Итак, где дополнительные «5» в конце возвращения? Я не могу понять это для жизни меня, довольно разочаровывающей, как вы могли себе представить.

Я ценю любую помощь с этим – и любые предложения!

Спасибо,

Evan

Solutions Collecting From Web of "Кодировать URL из C #, расшифровывать URL-адрес в PHP (добавляются дополнительные символы)"

 "CND0311J4S68CCU Ver. F.0BHPQOEM - f" 

закодированный как base64, не является:

 Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1 

Возможно, что-то еще добавляет 1 в конец, потому что

 echo base64_decode("Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY"); 

дает вам то, что вы ищете. И что-то добавляет его на самом деле System.Web.HttpServerUtility.UrlTokenEncode . Проблема заключается в следующем ( из MSDN ):

Этот ( System.Web.HttpServerUtility.UrlTokenEncode ) не использует стандартную кодировку. Он кодирует символы – и _, которые являются стандартными. Он также удаляет знаки =. Но вместо того, чтобы просто удалять их (они не нужны для декодирования строки), он заменяет их цифрой (0, 1, 2), указывающей число = знаков, которые были удалены.

Так что идите ( Demo ):

 <?php $urltoken = "Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1"; echo urltoken_decode($urltoken); function urltoken_decode($token) { return base64_decode(substr($token, 0, -1)); } 

Функция довольно грубая и может быть улучшена, чтобы действительно иметь дело с ней более конкретно ( Demo2 ):

 function urltoken_decode($token) { $len = strlen($token); if (!$len) return $token; $digit = $token[$len-1]; if (!in_array($digit, range(0,2))) { throw InvalidArgumentException(sprintf('Invalid end digit (%s).', $digit)); } return base64_decode(substr($token, 0, -1)); } 

Интересно – когда я кодирую «CND0311J4S68CCU Ver. F.0BHPQOEM – f» на этом сайте (используя JavaScript), он кодируется как «Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY». Если я декодирую «Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1», я получаю дополнительные 5 на конце. По-видимому, проблема заключается в конце кодирования – возможно, попытайтесь вывести значение, которое вы кодируете, прежде чем оно будет передано кодеку base64, чтобы убедиться, что это именно то, что вы думаете?